Pull to refresh
66
0
Alexey Dokuchaev @danfe

Оператор ЭВМ

Send message

Камера в ноутбуке — это просто USB устройство (http://www.thinkwiki.org/wiki/Integrated_camera; очень редко — PCIe устройство) со своим контроллером и прошивкой. Контроллер должен быть запитан, чтобы выполнить инициализацию USB (PCIe) и обнаружиться в ОС для выбора подходящего драйвера. И именно прошивка контроллера будет давать питание на светодиод. В некоторых случаях прошивка сделает это сама, в других — по команде от драйвера. В некоторых драйверах LED можно не включать при активации камеры (что может быть полезно для режима "motion-activated camera") — Logitech QuickCam — "LVUVC_LEDControl=0x0", в других требуется перезаливка модифицированной прошивки в камеру macbook 2008 — iSight = iSeeYou (здесь LED включается аппаратно при сигнале 0 на линии Standby между Cypress EZ-USB FX2LP и CMOS-модулем; в своей прошивке авторы ввели команду, после которой cypress не подает 0 на standby и не включает led).
Некоторые авторы считают, что в стандарте UVC есть контроль за LED — "LED indicator light is controlled by the host software" ("The UVC utilities that come with Linux allow you to control this light directly with a command-line tool, being able to turn off the light while the camera is on."). На самом деле в UVC есть протокол для изменения настроек контроллера, и uvcdynctrl умеет выключать LED для двух контроллеров — пример для QuickCam.

У меня цифр под рукой нет. Всё в офисе. Решил, что отвечу после праздников.

По поводу диагностики V519. Она «звучит» в описании так:

/*
Генерирует предупреждение V519.
Одному и тому же объекту дважды подряд присваиваются значения.
Высока вероятность опечатки.
Пример:
x = 1;
x = 2;
Исключения:
1) Объект участвует во втором выражении в правой части:
  x = 1;
  x = x + Foo();
2) Объект является результатом выражения с участием функции.
 (На самом деле отбрасываем больше случаев. Если слева выражение,
 которое представляет не унарную операцию разыменования '*' или
 не обращение к элементу массива - то мы не анализируем дальше).
 GetRef() = 1;
 GetRef() = 1;
3) Слева используется инкремент или декремент.
 *p++ = 1;
 *p++ = 1;
4) Для индексации к элементам используется неконстантное выражение.
 int i;
 p[i] = 1; 
 Foo(); //Foo может менять i.
 p[i] = 2;
5) Не ругаться, если первый раз переменной типа указатель (или класс) присваивается 0.
   p = nullptr;
   p = new int[n];
6) Если слева переменная имеет особые исключительные имена. Имена:
   gLibNcFTP_Uses_Me_To_Quiet_Variable_Unused_Warnings (используетсяв макросе LIBNCFTP_USE_VAR)
7) Если в одном блоке более одной ситуации, когда подряд присваивается значение одной и
   той-же переменной, то это безопасно. Пример:
    res = RegQueryValueEx(...);
    res = RegQueryValueEx(...);
    res = RegQueryValueEx(...);
8) Если первая строка это объявление переменной.
   Если в первой строке мы объявляем ссылку:
   int &x = a;
   x = 2;
9) Если первая строка это объявление переменной. И это не Си файл.
10) Если первая строка это объявление переменной.
    Инициализируем литералом/константой 0, -1 или "".
    Возможно, есть приведение к какому-то типу: HRESULT hr = ((HRESULT)0L);
11) Если между двумя присваиваниями упоминается данный объект:
    A = 10;
    x = A;
    A = 20;
12) Если между двумя присваиваниями имеется:
    *case;
    *default;
    *break;
    *continue;
    *goto
    *return
    *delete
    *высказывание ((void)0); Такое бывает, когда исчезает assert().
    *пустое высказывание ';'. Такое бывает, когда исчезает что-то типа VivaAssert().
    *throw
13) Если между двумя присваиваниями имеется вызов неитерабельной функции и при этом объект
    является глобальным (или ссылкой, или статической переменной,
    и мы не разыменовываем указатель или брался адрес этой переменной ). 
    Примеры:
    1) A = B; A = FOO();
    2) A = B; FOO(); A = C;
      Исключение из исключения, случай, когда справа одинаковый вызов функции:
        A = z.F(1);
        A = z.F(1); //Скорее всего это copy-paste.
        В общем Исключение N13 не срабатывет, если 2 строки совпадают.
    3) И ещё отдельно рассматриваем такой случай:
       temp = strchr(hoststr, '/');
       *temp = '\0';
       hostlen = strlen( hoststr );
       *temp = '/';
14) Между двумя присваиваниями есть #if/#else/#endif
15) Всегда безопасно, если первый раз присваиваем -1. 
    При этом между первым и вторым присваиванием есть хоть один вызов функции или оператор new.
16) Создаётся список с помощью выражения вида: t = t->next = ptr; 
    Не ругаемся, если записываем результат присваивания в переменную A, являющуюся левой частью для A->B.

Уровни:
  По умолчанию уровень 2. 
  Если первая строка это объявление переменной - уровень 3.
  На 3 уровень, если переменная имеет имя: hr, hres, err, result

  Если это массив и строки рядом, то на 1 уровень.
*/
Я сейчас собираю 3.16, чтоб завести Bluetooth. Вдруг и проблемы со сном там уже нет.

Спойлер
$ lspci -vx
00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 0b)
Subsystem: Microsoft Corporation Device 0a04
Flags: bus master, fast devsel, latency 0
Capabilities: 00: 86 80 04 0a 06 00 90 20 0b 00 00 06 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 14 14 04 0a
30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00

00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b) (prog-if 00 [VGA controller])
Subsystem: Microsoft Corporation Device 0005
Flags: bus master, fast devsel, latency 0, IRQ 62
Memory at c0000000 (64-bit, non-prefetchable) [size=4M]
Memory at b0000000 (64-bit, prefetchable) [size=256M]
I/O ports at 3000 [size=64]
Expansion ROM at [disabled]
Capabilities: Kernel driver in use: i915
00: 86 80 16 0a 07 04 90 00 0b 00 00 03 00 00 00 00
10: 04 00 00 c0 00 00 00 00 0c 00 00 b0 00 00 00 00
20: 01 30 00 00 00 00 00 00 00 00 00 00 14 14 05 00
30: 00 00 00 00 90 00 00 00 00 00 00 00 ff 01 00 00

00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 0b)
Subsystem: Intel Corporation Haswell-ULT HD Audio Controller
Flags: bus master, fast devsel, latency 0, IRQ 64
Memory at c0614000 (64-bit, non-prefetchable) [size=16K]
Capabilities: Kernel driver in use: snd_hda_intel
00: 86 80 0c 0a 06 04 10 00 0b 00 03 04 10 00 00 00
10: 04 40 61 c0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 86 80 0c 0a
30: 00 00 00 00 50 00 00 00 00 00 00 00 ff 01 00 00

00:14.0 USB controller: Intel Corporation Lynx Point-LP USB xHCI HC (rev 04) (prog-if 30 [XHCI])
Subsystem: Microsoft Corporation Device 9c31
Flags: bus master, medium devsel, latency 0, IRQ 60
Memory at c0600000 (64-bit, non-prefetchable) [size=64K]
Capabilities: Kernel driver in use: xhci_hcd
00: 86 80 31 9c 06 04 90 02 04 30 03 0c 00 00 00 00
10: 04 00 60 c0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 14 14 31 9c
30: 00 00 00 00 70 00 00 00 00 00 00 00 ff 01 00 00

00:16.0 Communication controller: Intel Corporation Lynx Point-LP HECI #0 (rev 04)
Subsystem: Microsoft Corporation Device 9c3a
Flags: bus master, fast devsel, latency 0, IRQ 63
Memory at c061c000 (64-bit, non-prefetchable) [size=32]
Capabilities: Kernel driver in use: mei_me
00: 86 80 3a 9c 06 04 10 00 04 00 80 07 00 00 80 00
10: 04 c0 61 c0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 14 14 3a 9c
30: 00 00 00 00 50 00 00 00 00 00 00 00 ff 01 00 00

00:1b.0 Audio device: Intel Corporation Lynx Point-LP HD Audio Controller (rev 04)
Subsystem: Microsoft Corporation Device 9c20
Flags: bus master, fast devsel, latency 0, IRQ 61
Memory at c0610000 (64-bit, non-prefetchable) [size=16K]
Capabilities: Kernel driver in use: snd_hda_intel
00: 86 80 20 9c 06 04 10 00 04 00 03 04 10 00 00 00
10: 04 00 61 c0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 14 14 20 9c
30: 00 00 00 00 50 00 00 00 00 00 00 00 ff 01 00 00

00:1c.0 PCI bridge: Intel Corporation Lynx Point-LP PCI Express Root Port 3 (rev e4) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
Memory behind bridge: c0400000-c05fffff
Capabilities: Kernel driver in use: pcieport
00: 86 80 14 9c 07 04 10 00 e4 00 04 06 10 00 81 00
10: 00 00 00 00 00 00 00 00 00 01 01 00 f0 00 00 00
20: 40 c0 50 c0 f1 ff 01 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 ff 03 10 00

00:1f.0 ISA bridge: Intel Corporation Lynx Point-LP LPC Controller (rev 04)
Subsystem: Microsoft Corporation Device 9c43
Flags: bus master, medium devsel, latency 0
Capabilities: Kernel driver in use: lpc_ich
00: 86 80 43 9c 07 00 10 02 04 00 01 06 00 00 80 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 14 14 43 9c
30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00

00:1f.2 SATA controller: Intel Corporation Lynx Point-LP SATA Controller 1 [AHCI mode] (rev 04) (prog-if 01 [AHCI 1.0])
Subsystem: Microsoft Corporation Device 9c03
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 59
I/O ports at 30b0 [size=8]
I/O ports at 30a0 [size=4]
I/O ports at 3090 [size=8]
I/O ports at 3080 [size=4]
I/O ports at 3060 [size=32]
Memory at c061a000 (32-bit, non-prefetchable) [size=2K]
Capabilities: Kernel driver in use: ahci
00: 86 80 03 9c 07 04 b0 02 04 01 06 01 00 00 00 00
10: b1 30 00 00 a1 30 00 00 91 30 00 00 81 30 00 00
20: 61 30 00 00 00 a0 61 c0 00 00 00 00 14 14 03 9c
30: 00 00 00 00 80 00 00 00 00 00 00 00 ff 02 00 00

00:1f.3 SMBus: Intel Corporation Lynx Point-LP SMBus Controller (rev 04)
Subsystem: Microsoft Corporation Device 9c22
Flags: medium devsel, IRQ 18
Memory at c0619000 (64-bit, non-prefetchable) [size=256]
I/O ports at 3040 [size=32]
00: 86 80 22 9c 03 00 80 02 04 00 05 0c 00 00 00 00
10: 04 90 61 c0 00 00 00 00 00 00 00 00 00 00 00 00
20: 41 30 00 00 00 00 00 00 00 00 00 00 14 14 22 9c
30: 00 00 00 00 00 00 00 00 00 00 00 00 ff 03 00 00

01:00.0 Ethernet controller: Marvell Technology Group Ltd. Device 2b38
Subsystem: Device 0001:045e
Flags: bus master, fast devsel, latency 0, IRQ 18
Memory at c0500000 (64-bit, prefetchable) [size=1M]
Memory at c0400000 (64-bit, prefetchable) [size=1M]
Capabilities: Kernel driver in use: mwifiex_pcie
00: ab 11 38 2b 06 00 10 00 00 00 00 02 10 00 00 00
10: 0c 00 50 c0 00 00 00 00 0c 00 40 c0 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 01 00 5e 04
30: 00 00 00 00 40 00 00 00 00 00 00 00 ff 01 00 00

В общем спорить больше не собираюсь, отвечу только на ваш вопрос. Посмотрел «задачу поддых». Поверьте, это совершенно не проблема, а типичная ситуация в MVVM. Проблемой она становится тогда, когда люди неправильно применяют WPF, фактически нарушая MVVM. А именно: во вьюмодели родительского окна, в команде, НЕЛЬЗЯ создавать вьюшку дочернего. Вьюмодели не знаю о вьюхах! Они должны знать только друг о друге. И вьюхи друг о друге, но не о вьюмоделях.

Решается очень просто. В команде родительской вьюмодели создаем дочернюю вьюмодель, передавая в нее все необходимые данные (иногда — просто ссылку на себя), и вызываем сервис, который по вьюмодели автоматом строит вью. Это умеет делать Catel, MVVM-фреймворк последнего поколения.

Мой видеоурок на эту тему: http://www.youtube.com/watch?v=qAktu1eGGa8
И код из видео: https://github.com/TimeCoder/DotNet/blob/master/src/BooksLibrary/ViewModels/MainViewModel.cs (строка 88)

Например, сейчас если у вас есть функция, которая принимает параметром коллекцию и не меняет ее (например, считает что-то на основе данных в коллекции), то в Rust вам придется написать две версии такой функции: одну для immutable коллекции, и одну — для mutable, — потому что так сейчас устроена система типов.


Вы что-то путаете. В Rust мутабельность определяется не структурой самой по себе, а тем, что с ней можно сделать и в каком слоте она лежит.

Если вы создаёте, например, коллекцию, и хотите, чтобы кто-то мог её изменить, вы пишете методы, которые меняют коллекцию, так, чтобы они принимали &mut self. Методы, которые не меняют коллекцию, будут принимать просто &self. После этого вы можете вызывать изменяющие и неизменяющие методы, если структура лежит в мутабельной переменной, и только неизменяющие, если структура лежит в немутабельной переменной. Поэтому если вы не собираетесь менять коллекцию, вам понадобится только одна функция, которая принимает &; если же вы хотите менять коллекцию, в функцию вам понадобится передавать &mut:

pub struct SomeCollection<T> {
    // ...
}

impl<T: Copy> SomeCollection<T> {
    fn get(&self, i: uint) -> T { ... }
    fn set(&mut self, i: uint, v: T) { ... }
}

fn compute_something(coll: &SomeCollection<int>) -> int {
    // здесь можно вызвать coll.get():
    let x = coll.get(0);
    // но вызвать coll.set() нельзя, будет ошибка компиляции
    // coll.set(0, x+1); 
    x
}

fn compute_and_modify(coll: &mut SomeCollection<int>) -> int {
    // здесь можно и то, и другое
    let x = coll.get(0);
    coll.set(0, x+1);
    x
}

fn main() {
    // s1 - неизменяемый слот (переменная)
    let s1: SomeCollection<int> = SomeCollection { ... };

    // можно вызвать compute_something(), но не compute_and_modify()
    println!("{}", compute_something(&s1));
    // println!("{}", compute_and_modify(&mut s1));

    let mut s2 = s1;  // перемещаем в мутабельный слот
    // можно вызвать и то, и другое
    println!("{}", compute_something(&s2));
    println!("{}", compute_and_modify(&mut s2));
}

UFO landed and left these words here
Но надо иметь в виду, что книга довольно старая и в ней присутствует несколько фактов, которые уже не актуальны или ложны. Например, необходимость вложенную объявлять структуру как дружественную, чтобы иметь доступ к её членам (том1, стр. 201), использование
enum
вместо
static const
в классах (том 1, стр. 266).
UFO landed and left these words here
Предлагаю вашему вниманию моё небольшое независимое расследование причин, которые привели к появлению данного «бага».

Фича убивания приложений, захвативших клавиатуру, была в Xorg испокон веков. Вот например мануал на xorg.conf аж 2004 года. Обратите внимание на опции «AllowDeactivateGrabs» и «AllowClosedownGrabs» — действия срабатывают по нажатию тех же самых горячих клавиш. Обратите также внимание, что прямо там, в мануале, сказано, что включение этих возможностей может привести к обходу скринсейверов и блокираторов экрана:
Note that the options AllowDeactivateGrabs and AllowClosedownGrabs will allow users to remove the grab used by screen saver/locker programs. An API was written to such cases. If you enable this option, make sure your screen saver/locker is updated.

Более того, в то время в Х-сервере имелось специальное API, которое позволяло локерам отключать эти комбинации клавиш, даже если они были включены в конфиге. Все счастливы.

Затем, в преддверии выхода xorg-server-X11R7-1.6, эту функциональность стали выпиливать (2008 год):
Update the Allow*Grabs documentation for xf86misc removal.
Remove the remainder of grab deactivation and closedown.
Зачем и почему это было сделано, я так и не смог раскопать. Загадочным образом, на 2008 год в почтовых архивах Xorg доступен только март месяц. Видно только, что оба коммита произвел некто Adam Jackson из RedHat.

Через некоторое время (2009 год) то тут, то там, то сям стали появляться сообщения пользователей, недовольных таким положением дел. Причем, в качестве причин назывались не только какие-нибудь там «закрыть зависшее приложение», а вполне себе серьезные «невозможно нормально отлаживать графические приложения, использующие захват клавиатуры» (если во время действия захвата сработает точка останова в отладчике, получаем дедлок — клавиатура/мышь недоступны, т.к. захвачены программой; программа никогда не освободит захват, т.к. остановлена отладчиком).

В этом письме David Campbell спрашивает «А планируется ли вообще что-нибудь взамен утраченных функций? И можно ли, пока этой замены нет, вернуть всё назад?»

На что Peter Hutterer ему отвечает, что «возвращать ничего не будем, потому что этот код не вписывается в новую архитектуру X-сервера, но возможно в будущем данная функциональность будет реализована немного иначе».

И вот, настал 2011 год. В июне Daniel Stone отправляет в список рассылки xorg-devel свой патч, который добавляет четыре новых «приватных действия» (private XKB action) в X-Server:
* PrGrbs: распечатать в лог-файл список активных захватов устройств ввода
* DeaGrb: отключить все захваты
* KilGrb: убить все приложения, у которых есть захваты
* PrWins: вывести в файл древовидный список окон


Также он пишет, что для использования этих действий, необходимо назначить им сочетание клавиш:
To use these, you need to modify your XKB maps, e.g. the following to
have Ctrl+Alt+Enter print all currently active grabs:
— compat/xfree86:
interpret XF86DOS {
action = Private(type=0x86, data=«PrGrbs»);
};

— symbols/pc:
key { type=«CTRL+ALT», [ Return, XF86DOS ] };


Но мы с вами помним, что отключение захватов и убивание приложений давным-давно уже было реализовано. По иронии судьбы, реализовано оно было через этот же механизм «приватных действий». Соответственно, действия «отключить все захваты» и «убить всех захватчиков» уже имели свои идентификаторы. О чем и напомнил Даниэлю… Peter Hutterer:
compat/xfree86 still has the stuff for «Ungrab» and «ClsGrab».

#define XF86XK_Ungrab 0x1008FE20 /* force ungrab */
#define XF86XK_ClearGrab 0x1008FE21 /* kill application with grab */

we should keep using them if possible.


Даниел, разумеется, согласился и заменил в своем патче «DeaGrb» на «Ungrab», а «KilGrb» на «ClsGrb». Вместе с другими поправками патч попал в master-ветку git-репозитория Xorg.

Но никто не заметил, что для старых «Ungrab» и «ClsGrb» уже были назначены сочетания клавиш — те самые ctrl + alt + / и ctrl + alt + *. Только в то время они были по-умолчанию выключены и включались через конфиг, поэтому никого не пугали. А автор нового патча предполагал, что сам факт назначения клавиш на эти действия будет являться подтверждением желания пользователя их использовать, но он не знал, что они уже назначены по умолчанию.

Результат, как говорится, на лицо.

Как же правильно исправить этот баг? Правильно! Снять назначенные клавиши, что и предлагают сделать в разных местах Сети.

Что же сделали, например, в Debian (спасибо porzione за выдержку из лога)? Они полностью откатили этот патч! То есть пользователи Debian теперь даже если захотят, не смогут включить возможность противостоять «захватчикам» их экрана. :)

Такая вот непридуманная история, господа.

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity