понедельник, 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.