Обновить
4
Dark Daskin@darkdaskin

Разработчик C#

Отправить сообщение
Я бы подобную задачу попытался решить полностью в управляемом коде. Можно нагенерировать проксей c MarshalAsAttribute в параметрах методов через Reflection.Emit и использовать ICustomMarshaller для передачи параметров в неуправляемый код. Разве что не уверен, что ModuleInitializer будет корректной заменой DllMain.
Даже бутылочку можно напечатать, но в сумке придётся отверстия делать, чтобы гипс выдувать.
В некоторых банках без определённых оборотов по дебетке процентов по ней не будет. Хотя у ТКС достаточно 1 транзакции в месяц.
Игру добавят в следующей версии.
Если хочется сэкономить пару перерисовок, можно не заниматься преждевременной оптимизацией, и оставить всё, как есть.
В некоторых фреймворках, например Angular, изменение модели на вид никак не влияет, фреймворк сам решает, когда перечитать модель, и такие оптимизации не понадобятся.

В примере 1, если одно действие пользователя вызовет добавление десятков строк в лог, а сама модель за лог не отвечает, задержка будет неплохим вариантом. Если лог генерируется в UI-потоке, можно поставить задержку в 1 мс, что по факту приведёт к 1 перерисовке сразу после завершения вычислений и освобождения UI-потока. Задержки по полсекунды нужны для других случаев, например, когда ввод текста пользователем вызывает отправку запросов на сервер (поисковые подсказки и т.д.).

В примере 2, результатом расчётов, видимо, является одно значение, вот пусть модель его и считает, а результат передаёт в модель вида, только когда он готов. Разделение на M и VM нужно, в том числе, и для этого.
В MVVM обычно можно создать привязку, которая будет отправлять данные в вид или модель вида с задержкой, игнорируя быстро происходящие изменения. В популярных фреймворках это делается одной строчкой: WPF, Knockout.
Подключение на тариф «3G+ Коннект» возможно только при покупке USB-модема
Интервал тарификации 100 Кб

Для целей статьи не очень подходит.
С какого-то момента стало проще прописать в hosts пару внутренних сайтов и уйти на Google DNS.
Мне вот такая штука попадалась: Atheer One. Поле зрения заметно больше, чем в Google Glass, да ещё и в стерео и с распознаванием жестов. Главный минус — требует подключения к телефону кабелем.
Впрочем, если нужно именно завернуть стороннюю асинхронную библиотеку, как в ymaps.js из поста, можно даже проще. Надо лишь указывать ! после имени модуля, чтобы сообщить requirejs, что это плагин.

ymaps.js
define(['module'], function (module) {
    var config = module.config();
    return {
        load: function (name, req, onload) {
            // Можно использовать любой другой способ загрузки 
            req(config.hosts.ymaps + '/2.1.4/?lang=ru-RU&load=package.full&coordorder=longlat', function() {
                ymaps.ready(function() {
                    onload(ymaps);
                });
            });
        }
    };
});


main.js
define(['ymaps!'], function (ymaps) {
    ymaps.someApiMethod();
});
В require.js можно использовать кастомные загрузчики для достижения асинхронной загрузки. В итоге API остаётся привычным AMD и никак не зависит от способа загрузки — когда все зависимости готовы, код модуля выполняется.
Неудобством является необходимость всегда указывать загрузчик перед именем модуля, впрочем это можно обойти костылями с маппингом.

В итоге код выглядит как-то так. Пишу по памяти после недавних экспериментов, возможно, прямо так и не заработает, у меня цели были немного другие.

loader.js
define([], function () {
    return {
        load: function (name, req, onload, config) {
            req([name], function (module) {
                module.ready(function () {
                    onload(module);
                });
            });
        }
    };
});


asyncModule.js
define([], function () {
    var callbacks = [];
    
    setTimeout(function () {
        for (var i = 0; i < callbacks.length; i++) {
            callbacks[i]();
        }
    }, 5000);
    
    return {
        // ...
        someApiMethod: function () {
            // ...
        },
        ready: function (callback) {
            callbacks.push(callback);
        })
    };
});


Использовать можно так:
main.js
define(['loader!asyncModule'], function (am) {
    am.someApiMethod();
});


Или так, если упоминать загрузчик везде не хочется:
myModule.js
define(['asyncModule'], function (am) {
    return {
        someMethod: function () {
            // blah blah
        },
        someOtherMethod: function () {
            // fdsfds
            am.someApiMethod();
            // burp
        }
    };
});

main.js
require.config({
    paths: {
        'raw/asyncModule': 'asyncModule'
    },
    map: {
        '*': {
            'asyncModule': 'loader!raw/asyncModule'
        }
    },
    deps: ['myModule'],
    callback: function (myModule) {
        myModule.someMethod();
        myModule.someOtherMethod();
    }
});
У нас в техникуме была самодельная клиент-серверная система тестирования. Виндовый клиент тянул вопросы с сервера и туда же отправлял результаты. Кому-то пришла в голову мысль поменять себе итоговый балл в ArtMoney, что прекрасно сработало. Через какое то время препод это дело запалил, добавил в тестовое приложение блокировку переключения окон. Я взялся было писать своё приложение, которое бы патчило тестовое автоматически в фоне, но вскоре тестовая программа вместе во всей базой просто были слиты с забытой преподом на несколько минут флешки. Вытаскивание незашифрованных данных не заняло много времени, в итоге к концу курса тесты проходились по одному человеку под строгим контролем преподавателя и дополнялись устными вопросами.
В университете всё уже было реализовано как полагается — с веб-интерфейсом, тонкими клиентами и слежением за шпаргалками. Оставалось только составлять таблицы соответствия варианты ответов -> итоговый балл, и угадывать из этих данных то, что не удалось ответить самостоятельно или найти в учебнике. По гуманитарным дисциплинам также был вариант скопировать учебник в буфер обмена и при возможности вставлять его в поля для ввода ответа и искать там. В технических учебниках формулы были картинками и толку от такого способа было гораздо меньше.
Во FreeNet используется похожая схема, однако в целях большей безопасности нельзя выбрать, какие сайты хранить у себя — пользователь вообще не может узнать, что хранит, соответственно, и привлечь его нельзя. Такая система стала уязвима к забиванию её терабайтами мусора, в итоге актуальные данные вытеснялись очень быстро. Года 2-3 назад пользоваться сетью было весьма затруднительно, как обстоят дела сейчас, не знаю.
Как мне кажется, править чужие библиотеки прямо по месту — плохая идея.
Если в библиотеке бага — стоит форкнуть её, поправить багу и отправить pull-request. Если нужна новая функциональность, с которой не согласен автор — напишите плагин или сделайте свой форк и разрешайте конфликты средствами системы контроля версий.
Если бага в сторонней библиотеке мешает продолжению разработки, а автор не спешит с выпуском новой версии — соберите свою версию пакета, дописав суффикс вроде -patch1 к полю Version. C NuGet Package Explorer это делается в пару кликов. Публиковать такой пакет необязательно, можно подключить локальную или сетевую папку как репозиторий.
В случае с CSS можно завести в проекте файлик вроде theme.patch.css и уже в нём переопределять желаемый кусочек, подключая этот файл на страницы после оригинала. С некоторыми JS-библиотеками тоже может прокатить.
Такие лампы часто дохнут от того, что вздувается электролит в блоке питания. Я его обычно меняю, и лампа ещё столько же служит. Иногда ещё SMD-шки на плате горят, тут уже проще всю плату заменить, чем разглядывать, что там было и восстанавливать горелые дорожки. Сама лампа портится гораздо реже и оставляет после себя плату под будущую замену.
Дело было к ночи, пришла в голову идея «решить» головоломку методом перебора. Об оценке времени перебора задумался, только когда скрипт был готов на 3/4, так что, осознав бессмысленность затеи, всё же дописал его, чтобы посчитать точное время выполнения.
Первые 2 решения нашлись за секунду, но уже на третей задаче потребовалось более 4 часов, чтобы убедиться, что решений короче 6 символов у неё нет. Наверняка можно оптимизировать алгоритм и перебирать 6- или даже 7-символьные решения за то же время, но решить задачу это не поможет.

Можно спать спокойно, в ближайшие несколько лет нас компьютерами не заменят :)

Если кому-то интересно, готовый скрипт на C#, реализованный в виде LINQ-выражения, можно посмотреть здесь. Писалось в LINQPad, требует HtmlAgilityPack и Newtonsoft.Json.
Без объектива лучи от каждой точки объекта попадают в каждый пиксель матрицы, в итоге каждый пиксель регистрирует усреднённое значение яркости объекта. Объектив же все лучи из определённой точки проецирует на определённый пиксель.
В некоторых случаях можно получить изображение без объектива, например, прислонив матрицу к дисплею (пиксели будут размытыми из-за зазора от защитного стекла) или послав на неё узконаправленный пучок (мы так на лабах форму и координаты лазерного луча определяли).
У меня ЖК-монитор так начинал пищать, когда в ждущий режим уходил. Приходилось выключать его кнопкой каждый раз, как отхтдил от компьютера. За пару лет кнопка износилась, пришлось идти другим путём и привыкать к постоянно открытому окну. Уличный шум раздражает меньше, чем этот писк, и успешно его заглушает (заодно заглушаются 50 герц из колонок). А если воткнуть флешку в USB-хаб потухшего монитора, писк усиливается так, что слышно даже сквозь уличный шум.
Вообще, такое поведение блока питания чем-то напоминает старый раздолбаный автобус, где всё ходит ходуном при остановке, но после начала движения тряска прекращается.
На деле однолинзовый объектив годится только бумажки от солнца поджигать. Причина — сферическая аберрация, то есть изображение выпуклое. Чем дальше рассматриваемый объект от центра линзы, тем он больше искажён. Даже в лупах обычно используются 2 склеенные линзы из разных стёкол, которые частично компенсируют недостатки друг друга. Разве что в очках линза одна, но её форма сложнее, что позволяет минимизировать аберрации, и оптическая сила обычно меньше, чем в объективах.
Вообще видов аберраций довольно много, поэтому реальные объективы содержат множество линз (минимум 3), чтобы всё это компенсировать.

Одну сферическую линзу в вакууме можно рассчитать и без всякого софта по простой формуле, но ещё одна особенность в том, что технология производства предполагает использование стандартных радиусов кривизны, поэтому и фокус получается неточным, и часто проще изменить другие части системы (в данном случае можно допустить, что изображение немного вылезет за границы матрицы), чем изготавливать сильно нестандартные линзы.

Кстати, когда я в ИТМО учился, у нас Zemax не преподавали, все сидели в DOS-приложении собственного производства ОПАЛ.
Уже в соседней комнате -85 dB, а если к дальней стенке отойти, отваливается. Чужих сигналов в этом диапазоне вообще не наблюдается.
Приходится по-прежнему 2.4 ГГц с 15 соседями делить.

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Десктоп разработчик, Бэкенд разработчик
Старший
C#
.NET
ASP.NET
WPF
SQL
Git
ООП
Английский язык
Разработка программного обеспечения
.NET Core