Pull to refresh
0
0
Алексей Малов @alexeymalov

Ведущий архитектор

Send message

Перепутаны байты с килобайтами.
Размер кластера составляет 512 байт, а не килобайт

постановил взыскать с Роскомсвободы

Может, с Роскомнадзора?

Вот тут автор пытается объяснить, почему 0 в 0 степени равен 1
https://youtu.be/7cQ5n9j5Guo

Возможно, вы слышали термин rest API. REST, который означает Representational State Transfer (Репрезентативный Государственный Перевод),

REST переводится как Передача Состояния Представления. Никаких государств.
https://ru.m.wikipedia.org/wiki/REST

Программная реализация умножения 8-битных чисел выполняется за пару сотен тактов на z80. умножение с использованием таблиц квадратов — несколько десятков тактов. При частоте процессора в 3,5 MHz ещё как ощутимо

Playcodemonkey.com
При помощи кода на coffee script управляешься обезьянкой и другими объектами на экране, чтобы собрать бананы

В википедии есть статья на эту тему
https://en.m.wikipedia.org/wiki/Alpha_compositing

А вот как на этот вопрос отвечает автор YouTube-канала minute physics
Выпустили опять поспешно. Как и в конце сентября с выпуском 19 версии, накосячили в ActiveX версии.
Теперь отломалась загрузка SWF-ок при помощи метода LoadMovie COM-объекта ShockwaveFlash. Причем отломалось от просто «не всегда загружается» до Segmentation Fault-а.
Простейший пример на VBScript (проявляется под Win10 на компе одного из наших тестеров) для воспроизведения проблемы:

Set f = CreateObject("ShockwaveFlash.ShockwaveFlash")
f.LoadMovie 0, "путь или URL до SWF-файла"


Как следствие, перестали работать desktop-приложения, использующие данный ActiveX-компонент.

Будем надеяться, что этот зарепорченный баг будут править несколько быстрее, чем сентябрьский, которые правили три недели. 3 недели, Карл!
В этом обновлении (FlashPlayer 19.0.0.185) сломался механизм сериализации состояния Flash-объекта, вставленного в OLE-контейнер, например, в презентацию PowerPoint:
Шаги для воспроизведения
1. Вставить флэшку в презентацию, как например в статье www.ispringsolutions.com/articles/how-to-insert-flash-into-powerpoint-2013.html
Флэшка в режиме слайд-шоу будет работать
2. Сохранить презентацию и закрыть ее
3. Открыть снова эту же презентацию.
4. PowerPoint сообщит, что ActiveX-объекты внутри презентации повреждены и предложит их починить.
5. После «починки» вставленные флэшки превращаются в тыкву, а презентацию нельзя будет сохранить, кроме как вручную удалив объекты со слайда.

Анализ содержимого pptx файла (который является zip-архивом с расширением .pptx) показывает, что в каталоге (ppt/activeX) файлики с метаданными activex-объекта activeX{N}.xml не содержат ничего кроме xml-заголовка:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>

Поэтому PowerPoint не может эти ActiveX-объекты загрузить.

18 версия Flash-плеера и более ранние сохраняли метаинформацию корректно:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ax:ocx ax:classid="{D27CDB6E-AE6D-11CF-96B8-444553540000}" ax:persistence="persistStorage" r:id="rId1" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />


Из-за этого ряд полезных продуктов для создания электронных учебных материалов, использующих функционал вставки Flash-объектов внутрь презентации, перестал нормально работать:
Articulate Presenter (Жалобы: community.articulate.com/discussions/articulate-presenter/mp4-woes)
Adobe Presenter (да, даже продукт Adobe из-за этого пострадал: forums.adobe.com/thread/1960956)
iSpring Suite
и другие.

Для тех, кому небезразлична судьба этого бага, просьба проголосовать за его исправление в багтрекере Adobe:
bugbase.adobe.com/index.cfm?event=bug&id=4062206
Добавлю, что weak_ptr может еще неожиданно обнулиться в многопоточном приложении, когда в нашем потоке есть только слабая ссылка, а сильные ссылки удалились в фоновом потоке.
Необходимое получение сильного указателя гарантирует, что объект будет жив, пока мы с ним работаем.

Ну и вот так пользоваться weak ptr в многопоточной среде небезопасно:
weak_ptr<Obj> w;
...
if (w.lock())
{
   // до повторного вызова lock счетчик ссылок может обнулиться в другом потоке, 
   // объект разрушиться. 
   // В дебаге мы словим assert, а в релизе - неопределенное поведение, 
   // причем это будет проявляться нестабильно
   w.lock()->DoSomething()
}

Вот годная статья «Пять подводных камней при использование shared_ptr»
habrahabr.ru/post/191018
Есть, правда, одно НО в этом примере. Т.к. документ владеет всеми находящимися в нем главами, удалятся они лишь вместе с ним самим
Набросал proof of concept (документ с рекурсивным добавлением глав), иллюстрирующий пользу от данного конструктора, а также от enable_shared_from_this:
документ не удаляется, пока есть ссылки хотя бы на одну из его глав. Т.к. каждая глава хранит weak_ptr на документ и обычный указатель на parent, всегда есть возможность получить как сам документ, так и ходить вверх по родительским главам.

Проверено на VS 2013
#include <memory>
#include <vector>
#include <set>
#include <stdexcept>
#include <algorithm>
#include <cassert>
#include <string>
#include <iostream>
#include <functional>

using namespace std;

struct Document;
typedef weak_ptr<Document> DocumentWeakPtr;
typedef shared_ptr<Document> DocumentSharedPtr;
typedef shared_ptr<const Document> ConstDocumentSharedPtr;

struct Chapter;
typedef weak_ptr<Chapter> ChapterWeakPtr;
typedef shared_ptr<Chapter> ChapterSharedPtr;
typedef shared_ptr<const Chapter> ConstChapterSharedPtr;

// Интерфейс контейнера глав
struct IChapterContainer
{
	virtual size_t GetChapterCount()const throw() = 0;
	virtual ChapterSharedPtr GetChapter(size_t index) = 0;
	virtual ConstChapterSharedPtr GetChapter(size_t index)const = 0;
	virtual const ChapterSharedPtr & AddChapter(const ChapterSharedPtr& chapter) = 0;
	virtual const ChapterSharedPtr & RemoveChapter(const ChapterSharedPtr& chapter) = 0;
	virtual DocumentSharedPtr GetDocument() throw () = 0;
	virtual ConstDocumentSharedPtr GetDocument()const throw() = 0;
protected:
	~IChapterContainer(){}
};

// Реализация контейнера глав
template <typename ThisType>
struct ChapterContainer 
	: IChapterContainer
	, enable_shared_from_this<ThisType>
{
	// Добавляет главу в контейнер (строгая гарантия безопасности исключений)
	const ChapterSharedPtr & AddChapter(const ChapterSharedPtr& chapter) override
	{
		// Главу нельзя добавить, если она находится в каком-либо контейнере
		if (chapter->m_parent)
		{
			throw logic_error("The chapter is already added to somewhere");
		}

		// Запрещаем добавлять главы, относящиеся к чужому документу
		if (chapter->m_document.lock() != GetDocument())
		{
			throw logic_error("The chapter belongs to a different document");
		}
		
		m_chapters.push_back(chapter);
		chapter->m_parent = this;
		return chapter;
	}

	// Удаляет главу из контейнера (строгая гарантия безопасности исключений)
	const ChapterSharedPtr & RemoveChapter(const ChapterSharedPtr& chapter)
	{
		// Нельзя удалить чужую главу
		if (chapter->m_parent != this)
		{
			throw invalid_argument("The chapter does not belong to this chapter container");
		}

		auto pos = find_if(m_chapters.begin(), m_chapters.end(), [&](const ChapterWeakPtr& item){
			return item.lock() == chapter;
		});

		assert(pos != m_chapters.end());
		m_chapters.erase(pos);
		chapter->m_parent = nullptr;

		return chapter;
	}

	virtual size_t GetChapterCount() const throw() override
	{
		return m_chapters.size();
	}

	virtual ChapterSharedPtr GetChapter(size_t index) override
	{
		return m_chapters.at(index).lock();
	}

	virtual ConstChapterSharedPtr GetChapter(size_t index) const override
	{
		return m_chapters.at(index).lock();
	}

private:
	vector<ChapterWeakPtr> m_chapters;
};

// Глава. Хранит заглавие, ссылки на документ-владелец и на родительский контейнер
// Глава также может хранить внутри себя дочерние главы
struct Chapter 
	: ChapterContainer<Chapter>
	
{
	friend struct Document;
	friend struct ChapterContainer < Chapter > ;
	friend struct ChapterContainer < Document >;

	virtual ConstDocumentSharedPtr GetDocument()const throw() override
	{
		return m_document.lock();
	}

	virtual DocumentSharedPtr GetDocument() throw() override
	{
		return m_document.lock();
	}

	// Возвращаем ссылку на родительский контейнер
	shared_ptr<const IChapterContainer> GetParent()const throw()
	{
		return {GetDocument(), m_parent};
	}

	// Возвращаем ссылку на родительский контейнер
	shared_ptr<IChapterContainer> GetParent() throw()
	{
		return{ GetDocument(), m_parent };
	}


	string GetTitle()const
	{
		return m_title;
	}

	~Chapter()
	{
		cout << "The chapter" << m_title << " has been destroyed" << endl;
	}

	Chapter(const Chapter&) = delete;
	Chapter& operator=(const Chapter&) = delete;
private:
	Chapter(const DocumentSharedPtr & document, const string& title = string())
		: m_document(document)
		, m_title(title)
	{
	}

	DocumentWeakPtr m_document;
	string m_title;
	IChapterContainer* m_parent = nullptr;
};

// Документ. Управляет главами
struct Document 
	: ChapterContainer<Document>
{
	Document(const Document&) = delete;
	Document& operator=(const Document&) = delete;

	static DocumentSharedPtr Create()
	{
		// Нельзя использовать make_shared из-за приватного деструктора
		return DocumentSharedPtr(new Document());
	}

	virtual DocumentSharedPtr GetDocument() throw () override
	{
		return shared_from_this();
	}

	virtual ConstDocumentSharedPtr GetDocument() const throw() override
	{
		return shared_from_this();
	}

	// Создает главу и сохраняет ее внутри документа. Обеспечивает строгую гарантию безопасности исключений
	shared_ptr<Chapter> CreateChapter(const string& title = string())
	{
		// Получаем сильную ссылку на самих себя
		auto strongThis = shared_from_this();

		// Создаем главу, которая сохранит слабую ссылку на нас
		// make_unique не доступен из-за приватного конструктора, поэтому создаем через new
		unique_ptr<Chapter> chapter(new Chapter(strongThis, title)); // Может выбросить исключение, но не страшно

		// Помещаем ее во множество глав документа
		auto result = m_chapters.insert(move(chapter)); // Может выбросить исключение, но не страшно

		// Оборачиваем указатель указатель в shared_ptr
		return shared_ptr<Chapter>(strongThis, result.first->get()); // не выбрасывает исключений
	}

	~Document()
	{
		cout << "The document is being destroyed" << endl;
	}
private:
	Document() = default;

	set<unique_ptr<Chapter>> m_chapters;
};

void PrintTableOfContents(const Document& doc)
{
	function<void(const IChapterContainer& container, const string& prefix)> PrintContainer;
	PrintContainer = [&](const IChapterContainer& container, const string& prefix)
	{
		auto numChapters = container.GetChapterCount();
		for (size_t i = 0; i < numChapters; ++i)
		{
			auto chapter = container.GetChapter(i);
			auto intro = prefix + to_string(i + 1) + ".";
			cout << intro << " " << chapter->GetTitle() << endl;
			PrintContainer(*chapter, intro);
		}
	};
	PrintContainer(doc, string());
}

void main()
{
	ChapterSharedPtr someChapter;
	{
		auto document = Document::Create();

		assert(document->GetDocument() == document);

		auto chapter1 = document->AddChapter(document->CreateChapter("Chapter 1"));
		assert(chapter1->GetParent() == document);

		auto chapter2 = document->AddChapter(document->CreateChapter("Chapter 2"));
		auto chapter3 = document->AddChapter(document->CreateChapter("Chapter 3"));
		auto chapter21 = chapter2->AddChapter(document->CreateChapter("Chapter 2.1"));
		auto chapter22 = chapter21->GetParent()->AddChapter(document->CreateChapter("Chapter 2.2"));
		assert(chapter21->GetParent() == chapter2);

		PrintTableOfContents(*document);

		cout << "-------Moving Chapter 1 into Chapter 2.1" << endl;

		chapter21->AddChapter(document->RemoveChapter(chapter1));
		assert(chapter1->GetParent() == chapter21);

		PrintTableOfContents(*document);

		cout << "------- Removing Chapter 2.1" << endl;

		chapter2->RemoveChapter(chapter21);
		assert(!chapter21->GetParent());

		PrintTableOfContents(*document);

		someChapter = chapter2;
		// Несмотря на то, что ссылка document уничтожится при выходе из блока,
		// счетчик ссылок на документ не обнулится за счет aliasing-ссылки someChapter из внешнего блока
	}

	cout << "------- Printing the document obtained through the chapter.GetDocument()" << endl;

	// Восстанавливаем ссылку на документ по имеющейся ссылке на одну из глав
	auto doc = someChapter->GetDocument();
	PrintTableOfContents(*doc);

	// При выходе из этого блока счетчик ссылок на документ обнулится и он с главами будет выпилен
	cout << "------- Leaving the function" << endl;
}

Вывод в stdout
1. Chapter 1
2. Chapter 2
2.1. Chapter 2.1
2.2. Chapter 2.2
3. Chapter 3
-------Moving Chapter 1 into Chapter 2.1
1. Chapter 2
1.1. Chapter 2.1
1.1.1. Chapter 1
1.2. Chapter 2.2
2. Chapter 3
— Removing Chapter 2.1
1. Chapter 2
1.1. Chapter 2.2
2. Chapter 3
— Printing the document obtained through the chapter.GetDocument()
1. Chapter 2
1.1. Chapter 2.2
2. Chapter 3
— Leaving the function
The document is being destroyed
The chapterChapter 2.2 has been destroyed
The chapterChapter 2.1 has been destroyed
The chapterChapter 3 has been destroyed
The chapterChapter 2 has been destroyed
The chapterChapter 1 has been destroyed



Оно же на гитхаб
Не дописал. В com передается для похожих целей pOuterUnknown для целей агрегации
Пример —
внешний объект — Dom document, например xml.
внутри него — узлы, хранящие weak_ptr на документ и позволяющие его получить.
Тогда можно передать клиенту узел для обработки, а не пару «документ+узел».
Так документ будет жить за счёт жизни узла, а получить документ можно будет, вызвав у узла метод GetDocument(), создающий shared-ссылку из weak.
Другой пример: человек, у него есть руки-ноги. Держишь человека за руку, логично ожидать, что он не убежит (не удалится)
В COM
Далеко не везде.
Она тогда не из дешевых операций была.
А тут вычисления сводятся всего к 3-4 нескольким элементарным операциям вроде сдвига, сложения и вычитания
А ничего, что еще в 60-е годы до этого додумался товарищ Брезенхэм из IBM?
См. Алгоритм Брезенхэма

Кроме того, алгоритм достаточно очевиден, чтобы до него додуматься самостоятельно, воспользовавшись свойством разницы квадратов соседних чисел (которая увеличивается на 2). В 11 классе аналогичный алгоритм рисования окружности придумал, когда встала задача быстро рисовать круги и окружности на ZX-Spectrum (В процессоре Z-80 не только инструкций для извлечения квадратного корня, там даже операций умножения и деления не было, только сложения, вычитания, сдвиги, да логические операции). Потом был слегка разочарован, узнав, что не я один такой умный был.
Был у нас такой любитель русскоязычных переменных, когда ушел из команды, оставил после себя переменные навроде х#@ваПеременная.

Или вот еще, клиент из Франции присылал пример кода с французскими переменными и комментариями. Пришлось google translate-ом пользоваться.

Спасибо, что китайцы или индусы ничего подобного не присылали.

Если уж давать имена идентификаторам, то по английски. Если писать комментарии, то также на английском (хотя, уровень английского языка у разработчиков тоже разный бывает).
Спасибо за полезную информацию. Постараюсь улучшить свои лекции и стиль преподавания
Можете поделиться ссылками на вышеупомянутые ресурсы?
1

Information

Rating
Does not participate
Location
Йошкар-Ола, Марий Эл, Россия
Date of birth
Registered
Activity