Вступ
Нещодавно при роботі над проектом навчальної практики виникла потреба з свого коду породжувати довільний процес і одночасно читати його stdout і stderr. Так як додаток пишеться виключно для linux, я вирішив заодно розібратися з epoll. Для запуску процесу на просторах інтернету була знайдена маленька бібліотека, робить саме те, що потрібно, та ще й обертаюча введення-виведення в звичні потоки із стандартної бібліотеки (мова про <iostream>).

Озброївшись кількома статтями про epoll, я вже було збирався писати код, якщо б не одне «але» — для epoll потрібний доступ до «сирим» файловим дескрипторам, а автор бібліотеки не надає public-доступу до них. Методи класу, повертають дескриптори, приховані під грифом «protected».

Що робити?
Найпростішим було б виправити код бібліотеки і перемістити потрібні методи public-секцію, ще краще було б форкнуть бібліотеку і реалізувати необхідний функціонал самому. Але перше було б негарно і обіцяло б конфліктами при оновленні бібліотеки, а друге зайняло б занадто багато часу на розбір коду бібліотеки і подальше тестування під кількома різними *nix-системами.

Тому в голову прийшла божевільна третя думка: чому б не спробувати як-то гарно «зламати» ООП і «легально» отримати доступ до protected-методом без втручання у вихідний код бібліотеки? Про те, які виникли перепони на цьому шляху і як допоміг C++14 в їх подоланні, і піде розповідь у даній публікації.

Читати далі →



Почалося все як завжди — з підозр. Аж надто багато людей приходить на мої сайти, які скачують дистрибутиви програм за прямими посиланнями без рефереров. Якось дивно це, правда? Не може ж бути так популярні блокувальники посилань. Я помічав деякі адреси і користувачі зазвичай приходили знову скачувати без посилання. Часто іншу програму — ніяк не відноситься до першої. Далі пішли в хід перевірки, що так як в логах. Виявилося, що абсолютна більшість таких заходів — дивні користувачі, які мають порожні HTTP_ACCEPT_ENCODING і HTTP_ACCEPT_LANGUAGE. HTTP_USER_AGENT іноді вказує на Java, JavaScript, Wget, Perl, PHP і так далі, але більшість звичайні рядки браузерів. Всі більш-менш пристойні пошуковики у мене давно враховуються і це, звичайно, не вони.

Читати далі →

Monster
Ті, хто цікавиться версткою, frontend розробкою і веб-дизайном, ймовірно, помітили, що в останні кілька місяців у мережі все частіше стали з'являтися анімовані картинки, зроблені за допомогою HTML і CSS. У цій статті я постараюся розповісти звідки це віяння з'явилося, в чому фішка, і чому це стало так популярно серед верстальників (а можливо хтось ще не чув, може бути цікаво познайомитися з таким видом діяльності).
Читати далі →

Всім привіт! У статті буде представлена спрощена реалізацію
Stream
з Java 8 на С++. Скажу відразу, що:
  • на відміну від Java не використовуються відстрочені обчислень;
  • немає паралельних версій;
  • місцями поєднує
    Stream
    та
    Collectors
    ;
  • використовуються прості і готові рішення від STL, тут немає чистого ФП, де тільки рекурсія;
  • не використовуються техніки оптимізації.
В цій версії основний упор зроблений на те, щоб швидко і просто зробити велосипед). Про ФП згадано по-мінімуму (комбінаторам уваги не приділено :)).
Інтерфейс
template < typename Type>
class Stream : private StreamImpl<Type>
{
private:
typedef StreamImpl<Type> Parent;
public:
using Parent::Parent; // конструктори успадковані
using Parent::data;
using Parent::isEmpty;
using Parent::count;
using Parent::flatMap;
using Parent::map;
using Parent::reduce;
using Parent::filter;
using Parent::allMatch;
using Parent::noneMatch;
using Parent::groupingBy;
using Parent::partitionBy;
using Parent::minElement;
using Parent::maxElement;
~Stream() = default;
};

Читати далі →



Попалася мені в середині минулого тижня стаття про те, що гра Doom портована на купу різних платформ. У списку були і калькулятори і осцилографи. Були там і наручний годинник Apple Watch і Android Wear. Але чомусь не було годин Samsung Gear S2 та S3, які працюють на Tizen. Дивно, годинник потужні. А в мене як раз є досвід розробки для них. Відмінно, я вирішив, що виклик прийнятий.

Читати далі →

Всім привіт!
До мене через лічку звернулися товариші, сказавши що, вони не хочуть коментувати те, що не зрозуміли або не зрозуміли до кінця й попросили дати пояснення. На основі надісланих питань я спробую дати відповіді в доступній формі.
Чим корисні иммутабельные дані в С++?
Читати далі →

Привіт, Хабр! Про иммутабельных даних чимало говориться, але про реалізацію на С++ знайти що-то складно. І тому вирішив заповнити прогалину в дебютній статті. Тим більше, що в мові D є, а в С++ – ні. Буде багато коду і багато букв.
Про стилі – службові класи і метафункции використовують імена в стилі STL і boost, користувальницькі класи в стилі Qt, з якою я в основному працюю.
Введення
Що з себе представляють иммутабельные дані? Иммутабельные дані – це наш старий знайомий const, тільки більш суворий. В ідеалі иммутабельность означає контекстно-независиую незмінюваність ні при яких умовах.
По суті иммутабельные дані повинні:
  • забезпечувати фізичну і логічну константность;
  • забороняти призначення нового значення на етапі компіляції;
    всі операції повинні проводитись над копією, а не над оригіналом.
Иммутабельные дані прийшли з функціонального програмування і знайшли місце в паралельному програмировании, т. к. гарантують відсутність побічних ефектів.
Як можна реалізувати иммутабельные дані в С++?
У С++ в нас є (сильно спрощено):
  • значення – об'єкти фундаментальних типів, екземпляри класів (структур, об'єднань), перерахувань;
  • покажчики;
    посилання;
    масиви.
void має сенс робити иммутабельными. Посилання теж не будемо робити иммутабельными, для цього є const reference_wrapper.

Читати далі →

У 2012 році користувач з ніком rovo89 на ком'юніті XDA опублікував вихідні коди і готовий до використання фреймворк, спрощує кастомізацію прошивок, з докладною інструкцією та прикладами, запропонувавши альтернативу традицоинному, на той момент, способу (деоксидирование → дизасемблювання → декомпіляція → рекомпиляция → тестування → завантаження патчів телефон): Частина 1 Частина 2, Частина 3, Частина 4

Він запропонував використовувати окремі модулі, які можна змінювати фактично нальоту, не втручаючись у вихідний код прошивки або окремих її компонентів. Але авторитетні розробники хором відповіли: "Неа… нікому це не потрібно"

Rovo не закинув своє дітище, а продовжив розвиток. Коли у 2013-му році вийшла версія KitKat, все те ж спільнота іменитих девелоперів відповіла: "Неа, це надто небезпечно… хоча..."

Тим часом Google прийняв рішення випускати нову версію операційної системи щорічно. Зрозуміло, стало накладно кастомизировать прошивки: не встигаєш зробити одну, як з'являється нова версія ОС. Так в 2014-му виходить версія Lollipop і розробники нарешті звертають увагу на фреймфорк з думками: "Може все ж варто подивитися що це таке? Виглядає багатообіцяючим".

У 2015-му році вийшла чергова версія (Marshmallow) і велика частина спільноти, в підсумку, визнала розробку вельми стоїть, на порядок скорочує час розробки кастомізації стічних прошивок у вигляді встановлення окремих модулів, що розширюють функціонал. "Нічого собі, це ж зовсім безпечно і є бібліотека готових корисних модулів!" — вигукнули вони.

Зараз кінець лютого 2017-го. Xposed під Nougat все ще не доступний, а юрби стражденних розробників і користувачів то і справа відкривають теми під тип "Xposed не працює! Він мені потрібен! Rovo, будь ласка!"

Сьогодні я розповім про Xposed Framework.

Читати далі →

Коли-те, давним-давно, коли я ще вчився програмувати на Паскалі, мені довелося на лабораторке переробляти одну власну функцію — потрібно було в результатах повертати не просто число, а число і рядок. Як було б добре, подумав я тоді, якщо б можна було повертати безліч змінних, як це зроблено для вхідних параметрів. Подумав, зітхнув і почав створювати структуру для передачі назад викликає функцію двох параметрів за раз.

Читати далі →

Секрет швидкого програмування: не замислюйтесь



Програмувати швидко — це легко! Так вважає інженер-програміст компанії Google, який всі публікації в своєму блозі підписує лаконічним «Макс». Макс також працює головним архітектором, ком'юніті-менеджером і реліз-менеджером в Bugzilla Project. Ми в Alconost вразили і перевели його поради про те, чи як навчитися програмувати з космічною швидкістю.

Якщо обговорювати з розробниками складність коду, вони часто говорять, що хочуть писати простий код, але із-за тиску дедлайнів і більш глибинних причин у них не вистачає часу або знань для того, щоб виконати завдання і оптимізувати рішення до максимальної простоти.

Вони, звичайно, мають рацію в тому, що в умовах стислих термінів розробники, як правило, будуть писати складний код. Втім, дедлайни не повинні призводити до складності. Замість фрази «Цей дедлайн завадив мені написати простий код» можна вимовити рівноцінну: «Я недостатньо швидко програмують, щоб писати просто». Тобто чим швидше ви як програміст — тим менше впливу на якість вашого коду мають дедлайни.

Тепер давайте розберемося, як, власне, стати швидше? Може, це вроджене магічне вміння? Треба бути «розумнішими» інших, щоб бути швидким?

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

Читати далі →