develop.16: Обсуждение вопросов программирования


1 . . . 4 5 6
Reply to: 9jitMzviVu3YywEkmsxR
From: vit01 (mira, 1) 13.03.17 07:49 UTC
To: Andrew Lobanov
Subject: Re: Git
AL> А ещё бы полноценный git-клиент под андроид. А то в маршрутке приходится книги читать, а мог бы тратить это время на написание игрушки на инстеде. Писать есть чем вполне сносно, а вот потом пушить изменения нечем.

Порекомендую клиент MGit или его предшественника (по форку) SGit. И коммитить, и пушить, и всё остальное необходимое умеет.
https://f-droid.org/repository/browse/?fdfilter=MG it&fdid=com.manichord.mgit

Кстати, а чем тебя Termux'овский гит не устроил? Это ведь тоже вполне рабочий вариант (даже более идеологически правильный). Пробовал и остался доволен.

Reply to: lCD62ZN1Syh5uBpK0s1g
From: Andrew Lobanov (Go!,0) 13.03.17 10:26 UTC
To: vit01
Subject: Re: Git
AL>> А ещё бы полноценный git-клиент под андроид. А то в маршрутке приходится книги читать, а мог бы тратить это время на написание игрушки на инстеде. Писать есть чем вполне сносно, а вот потом пушить изменения нечем.
vit01> Порекомендую клиент MGit или его предшественника (по форку) SGit. И коммитить, и пушить, и всё остальное необходимое умеет.
vit01> https://f-droid.org/repository/browse/?fdfilter=MG it&fdid=com.manichord.mgit

Спасибо. Попробую.

vit01> Кстати, а чем тебя Termux'овский гит не устроил? Это ведь тоже вполне рабочий вариант (даже более идеологически правильный). Пробовал и остался доволен.

Как-то не очень удобно получается с ним работать без hacker's keyboard, а от последней я отказался.

From: Andrew Lobanov (tavern,1) 07.05.17 08:56 UTC
To: All
Subject: Web и длинные ссылки
Есть div, у него задана ширина в процентах от вьюпорта, внутри длинная-длинная ссылка. Ссылка переносится, но только один раз, а потом растягивает этот div за пределы экрана. Как это можно забороть? Есть опыт?

Reply to: YARbKH21PcBj7i1mZPBU
From: Andrew Lobanov (tavern,1) 07.05.17 09:15 UTC
To: All
Subject: Re: Web и длинные ссылки
> Есть div, у него задана ширина в процентах от вьюпорта, внутри длинная-длинная ссылка. Ссылка переносится, но только один раз, а потом растягивает этот div за пределы экрана. Как это можно забороть? Есть опыт?

Таки разобрался.

====
word-break: break-all;
====

И всё отображается как мне надо.

From: Difrex (mira, 14) 23.05.17 14:24 UTC
To: All
Subject: Книги!
Зацените, что нашел https://github.com/miguellgt/books

Reply to: WNmkXDCqysYzvdis5RW4
From: vit01 (mira, 1) 23.05.17 14:50 UTC
To: Difrex
Subject: Re: Книги!
Интересно, интересно.
Целый набор "современного" девелопера. Куча джаваскрипта, новомодные angular и react, микросервисы (какой ужас, столько страшилок про них!), а также незаменимый Докер. Зачем туда закинули agile и tdd, вообще без понятия.

Хотя кто знает. Может быть, через год я сам буду клепать что-нибудь на React (если он к тому времени не выйдет из моды).

Из подборок книг больше всего нравится так распиаренный Free Programming Books. Там прямо всё по полочкам разложено в одном файле.

https://github.com/vhf/free-programming- books/blob/master/free-programming-books-ru.md

From: vit01 (mira, 1) 22.06.17 12:27 UTC
To: All
Subject: Машина снов на Arduino своими руками
Прочитал в интернете недавно про такую штуку как машина сновидений. Грубо говоря, это картонный вращающийся цилиндр вокруг источника света, с прорезями, создающий мерцание частотой 8-13 Гц. Оптический эффект от этого мерцания вызывает резонанс в мозгу, в результате чего от просмотра бликов у человека едет крыша, возникают интересные "галюны".

Подробнее читаем здесь: https://ru.wikipedia.org/wiki/Машина_сновидений

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

Осторожно, девайс может вызвать приступ эпилепсии! Если станет плохо, ответственности не несу!

Итак, чтобы изготовить трип-девайс из подручных средств, нам понадобятся:

1. Arduino или Raspberry Pi (или любую другую плату для самоделкиных). В данном случае ардуино
2. Три разноцветных светодиода или один RGB-LED. У меня в DIY-комплекте, заказанном из Китая, как раз оказался RGB-светодиод, поэтому я решил воспользоваться именно им
3. Устройство для преломления, чтобы создавать на стенах красивые цветовые картинки и усилить "наркоманский" эффект. Я использовал в качестве преломлятеля хрустальный стакан с резным узором.
4. Кнопка для переключения частот (8-13 Гц), дабы настраивать сеанс "под свой вкус". У меня хорошей кнопки не оказалось, поэтому я взял вместо неё датчик обхода препятствий. На него не надо нажимать пальцем, а достаточно лишь провести рукой на близком расстоянии.
5. [Опционально] источник питания для контроллера, ради портативности.
6. [Опционально] увеличительное стекло, лупа. Поможет делать другие прикольные узоры на стенах и потолке.

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

Исходник скетча для Arduino:

====
// периоды свечения/затухания светодиодов;
// соответствуют частотам от 8 до 13 Гц
int periods[] = {62, 56, 50, 45, 42, 38};

// светодиоды к аналоговым выводам, кнопку - к цифровому
int r = A0;
int g = A1;
int b = A2;
int button = 13;

byte selected_period_index = 0; // 1 период
int selected_period = 62;       // 1 период
boolean pressed = false;        // кнопка была нажата
boolean tmp_pressed = false;

// сохранённые значения цветов
byte last_r = 0;
byte last_g = 0;
byte last_b = 0;

void setup() {
  randomSeed(0);
  pinMode(button, INPUT);
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(b, OUTPUT);
}

void changePeriod() {
  if (selected_period_index < 5) selected_period_index++;
  else selected_period_index = 0;

  selected_period = periods[selected_period_index];
}

void color_enable() {
  // переставляем цвета местами и добавляем
  // на красный цвет рандом
  last_b = last_g;
  last_g = last_r;
  last_r = random(50, 255);
  // минимальное значение 50 нужно,
  // чтобы избегать появления тусклых цветов
  
  analogWrite(r, last_r);
  analogWrite(g, last_g);
  analogWrite(b, last_b);
}

void color_disable() {
  analogWrite(r, 0);
  analogWrite(g, 0);
  analogWrite(b, 0);
}

void loop() {
  color_enable(); // 1, 2, 3 - ёлочка, гори!

  // если кнопка была нажата, меняем частоту мерцания
  tmp_pressed = (digitalRead(button) == HIGH);
  if (pressed && !tmp_pressed) changePeriod();
  pressed = tmp_pressed;

  delay(selected_period);
  color_disable();
  delay(selected_period);
}
====

После загрузки программы и тестирования откладываем девайс до наступления полной темноты. Ночью перед его включением посоветую подобрать какой-нибудь годной музыки. Буквально вчера тестировал эту хрень в полной тишине, сегодня надо будет врубить музыку. Кстати, в моей комнате есть зеркало, поэтому усиление эффекта происходило и с его помощью.

Варианты эксплуатации:

1. Либо с открытыми глазами смотрим на стены и потолок (можно использовать линзы/лупу для ещё более прикольных узоров)
2. Или закрываем глаза и смотрим прямо на источник света.

Вот так выглядит моя самодельная хрень: https://ii-net.tk/ii/ii-point.php?q=/x/file/dream- arduino.jpg

Данный суперпростой девайс, собранный из г***а и палок, можно использовать как помощь с осознанными сновидениями, как средство релаксации или просто в качестве легальной, безвредной наркоты.

Прошу комментариев/вопросов, если кому-то стало интересно.

Reply to: STkMhQ2eSHnTPQqAynts
From: vit01 (mira, 1) 25.06.17 17:47 UTC
To: vit01
Subject: Re: Машина снов на Arduino своими руками
Усовершенствовал девайс, добавив туда второй светодиод и поменяв мою любимую для дебага Arduino UNO на портативную Arduino Pro Mini.

https://ii-net.tk/ii/ii-point.php?q=/x/file/dream- arduino-2.jpg

Вместо пауэрбэнка теперь три мизинчиковые батарейки, и трип-машину можно засунуть в карман. Цепь включается нажатием на контакты с питанием на плате (оказывается, кривая пайка может быть не только минусом, но и полезной фичей!).

Зачем мне понадобился второй светодиод?

1. При использовании единственного RGB-LED проявлялся не очень хороший эффект: полупроводники светодиода, часто моргая, перегревались, а перегрев являлся причиной случайных затуханий во время работы. Я бы мог разгрузить плату, добавив резистор, но не хотелось терять в яркости. Добавление второй лампочки означало то, что первая будет меньше мигать и меньше нагреваться (поставил так, чтобы они работали по очереди) -> "сеанс" теперь проходит плавно, без затуханий.

2. Второй светодиод из комплекта, в отличие от первого, хуже разделяет цвета на составляющие. Из-за этого в цветовые эффекты добавляется больше энтропии, а это плюс к психоделичности.

3. Пара разных источников света, как я выяснил на практике, гораздо сильнее "расшатывает" мозг, чем один. Действительно наркота какая-то

Упарываемся по-технарски %), хехехе
Вторая схема вообще полный улёт, рекомендую. И надеюсь, что роскомпозор не заблокирует IDEC за эту статью.

Reply to: hkJaVFHqCWrA5Q1EZ92X
From: vit01 (mira, 1) 26.06.17 15:51 UTC
To: vit01
Subject: Re: Машина снов на Arduino своими руками
Андрей попросил видео сабжа в действии. Вот оно:

https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVS H5U

Ничего интересного здесь нет (тем более, плохонькая камера мобильника не может запечатлеть эту игру света), но просто как факт.

From: vit01 (mira, 1) 27.06.17 16:03 UTC
To: All
Subject: Требуется сервер
Товарищи, нужна ваша консультация.

По случаю успешного окончания школы (золотая медаль как-никак) мне подогнали денег, и у меня есть план на лето.

Хочу заказать хороший, годный VPS на 2 месяца, чтобы установить туда эмулятор Андроида и IDE. На сервере, конечно же, будут иксы и доступ через VNC + RDP.
View-only доступ к рабочему столу думаю предоставить всем, а пароль "для дела" дать некоторым из вас, кому захочется. В первую очередь Борису, потому что он IDEC Mobile иногда помогает пилить.

Таким шагом будет ускорена разработка клиента и другого софта для IDEC, потому что сервак будет доступен 24/7, и мне не надо будет тратить время на перезагрузки, ожидания запуска IDE и "въезд" в сборочное окружение.
Можно будет писать код и компилить на даче, в транспорте и так далее. Не отрываться от кодинга.

Плюс есть надежды, что кто-нибудь будет помогать или давать свои комментарии в реалтайме

Требования к серверу

1. ОЗУ - 3-4 гига. Желательно 4
2. Место на диске сколько получится, но хотелось бы 30-40 гигов
3. ОС - любой линь, за исключением source-based (генту, слака).
4. Цена в районе 400-500 рублей в месяц. Можно меньше.

Если подскажете какой рабочий вариант, то это будет очень круто. Планирую развернуть сабж уже на этой неделе.

Reply to: M8IAd9wYoMWl6VR9eijz
From: Difrex (mira, 14) 27.06.17 17:01 UTC
To: vit01
Subject: Re: Требуется сервер
firstbyte.ru

У них хостюсь уже больше года -- полет отличный.

Reply to: yiI4LVy3PDVKeZ33rHyk
From: vit01 (mira, 1) 27.06.17 17:45 UTC
To: Difrex
Subject: Re: Требуется сервер
Difrex> firstbyte.ru

У них самый выгодный тариф - это за 399р. дают 2 гига ОЗУ и 40 гигов места.

Вот посмотрел сейчас на поисквпс, здесь советует несколько вариантов:

https://poiskvps.ru/index.php?search_hdd_min=25&se arch_hdd_max=60&search_ram_min=3072&search_ram_max =4096&search_price_max=500

Самый выгодный, на мой взгляд, последний, где 4 гига предлагают за 420 рублей. Но и остальные с 3 гигами не отстают.

Подожду ещё предложений от сетян.

Reply to: avexqVWmaSzLQfztSlRt
From: Andrew Lobanov (tavern,1) 27.06.17 18:12 UTC
To: vit01
Subject: Re: Машина снов на Arduino своими руками
vit01> Андрей попросил видео сабжа в действии. Вот оно:
vit01> https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVS H5U
vit01> Ничего интересного здесь нет (тем более, плохонькая камера мобильника не может запечатлеть эту игру света), но просто как факт.

Не взирая на то, что камера не сняла (ну почти не сняла) то, что было на стенах, мне видео понравилось =)

Reply to: HvUmGgKqIW7HBZhlrq6O
From: btimofeev (tavern,13) 27.06.17 18:42 UTC
To: vit01
Subject: Re: Машина снов на Arduino своими руками
vit01>> Андрей попросил видео сабжа в действии. Вот оно:
vit01>> https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVS H5U

AL> Не взирая на то, что камера не сняла (ну почти не сняла) то, что было на стенах, мне видео понравилось =)

Мне тоже понравилось, красиво мигает. А эффект от этого реально какой-то есть?

Reply to: Ao4shjsWTeEkPLNNOul6
From: vit01 (mira, 1) 28.06.17 14:09 UTC
To: btimofeev
Subject: Re: Машина снов на Arduino своими руками
btimofeev> А эффект от этого реально какой-то есть?

Если сидеть с открытыми глазами, то это как на дискотеке, только немного под трансом. Так или иначе, это интересно, рекомендую.

С закрытыми - уже трип какой-то напоминает. Через некоторое время сидения с закрытыми глазами появляются разные глюки, воображение усиливается. Можно вполне "выпасть" из реальности, наблюдая причудливые хренотени у себя в голове. Оказывается, сабж используют даже для психотерапии.
То есть мигалка нужна, если тебе слишком скучно, а фантазия плохо развита. Устройство как бы "подстёгивает" мозг на что-нибудь эдакое.

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

Здесь немного похожий принцип работы, только "подгон" для глюков поступает извне, ускоряя эффект и позволяя ему проявляться в более естесственных условиях.

Reply to: 91Z60B2BVj1eSMV2Jh58
From: Difrex (mira, 14) 28.06.17 15:07 UTC
To: vit01
Subject: Re: Требуется сервер
>У них самый выгодный тариф - это за 399р. дают 2 гига ОЗУ и 40 гигов места.
MSK-highmem-KVM-SAS-2 439р
* 2CPU
* 4Gb RAM
* 60Gb HDD

По-моему норм цена.

Reply to: rkDWxApuGBDKxCJvWFgL
From: vit01 (mira, 1) 28.06.17 17:48 UTC
To: Difrex
Subject: Re: Требуется сервер
Difrex> MSK-highmem-KVM-SAS-2 439р

Ой, я невнимательно просмотрел каталог :)

Спасибо за рекомендацию, заказал именно этот вариант, уже получил рута и пробую настраивать.

From: vit01 (mira, 1) 29.06.17 06:09 UTC
To: All
Subject: IDEC Mobile: кодинг в прямом эфире
Надоели скучные сериалы и реалити-шоу? Хочется посмотреть на эпик-мега-экшен?

Смотреть немое кино бесплатно без смс и регистрации:

====
$ vncviewer -Shared -ViewOnly debug.ii-net.tk:5901
====

Юзер debug
Пароль 303045

Встречайте актёров:

1. Андроид студия - главная героиня шоу. Обаятельная, привлекательная, но иногда очень капризная и упёртая свол^W IDE.
2. Виртуальный Android 4.4 - надёжный и неприхотливый эмулятор, который через годика два выйдет на пенсию. Обладает загадочным характером, будет периодически появляться и исчезать
3. Курсор мыши. Часто бездельничает, но иногда тыкает по кнопкам, бегает по спагетти-быдлокоду и выделяет текст.
4. Терминал. Всегда в своём репертуаре. Отображает белый текст на чёрном фоне.

Reply to: aL47CvXTam8mSLdySFsH
From: Difrex (mira, 14) 29.06.17 15:01 UTC
To: vit01
Subject: Re: IDEC Mobile: кодинг в прямом эфире
О, круто! =)

Reply to: wQLt8L8Xz0PlTjOIRA1p
From: vit01 (mira, 1) 30.06.17 16:08 UTC
To: Difrex
Subject: Re: IDEC Mobile: кодинг в прямом эфире
Кстати, как ни странно, пробросить порт дебага через ssh на удалёнку и набрать adb connect localhost субъективно кажется менее напряжным, чем возиться с проводами и подключением по локалке =)

Так что нафиг эмуляторы, буду продолжать работать с реальными устройствами. Но 4 гигабайта ОЗУ оказались не лишними. Теперь хотя бы браузер рядом с IDE не страшно включённым держать. И второй, запасной комп дома разгруженный сидит, так что разработка теперь без всяких напрягов и ненужных ожиданий происходит.

P.S. Кодинг-эксгибиционизм-шоу до сих пор идёт. Кому хочется (и тому, кто может в андроид), могу даже RW-пароль скинуть

From: vit01 (mira, 1) 10.07.17 18:00 UTC
To: All
Subject: Stringlate - перевод Android-приложений в два клика
Когда мне надо было перевести клиент на английский, то я сэкономил себе достаточно времени, используя сабжевое приложение.

https://github.com/LonamiWebs/Stringlate
https://f-droid.org/packages/io.github.lonamiwebs. stringlate/

Использовать его очень просто: вводите адрес Git-репозитория (есть интеграция с Github), дальше приложение само скачает и распарсит нужные ресурсы.

Потом можно спокойно править переводы через удобный GUI. После окончания работы можно экспортировать результат в файл, поделиться им по Email или сразу открыть Pull Request/Issue в репозитории. Рекомендую и одобряю.

From: vit01 (mira, 1) 16.07.17 08:21 UTC
To: All
Subject: [DIY] Как банка тушёнки улучшит жизнь в Vim & Emacs
Прочитав статью на Хабре про педалирование Vim ( https://habrahabr.ru/post/232177 ), я загорелся идеей сделать себе самодельную педальку для текстовых редакторов.
Как из того анекдота про педаль для Emacs, чтобы Ctrl зажимать, только уже не как анекдот, а на самом деле.

В оригинальной статье мужик закупил уже готовый корпус для педали и всунул туда контроллер. Однако мне ждать посылку из Китая было бы крайне грустно, хотелось сделать побыстрее и с использованием подручных материалов.

Внимание, даже если у вас нет Arduino, то всё равно дочитайте статью, там будет кое-что интересное про Linux!

Итак, если у нас будет педаль, то надо же куда-то ногой нажимать, верно? Съев на даче тушёнку, я не поспешил выбрасывать банку из-под неё, а вымыл и унёс домой.

Фотка 1: https://alicorn.tk/dashie/index.php/s/cIjtxJbHZJnN Fbz

Затем выбил у банки дно, распрямил развёртку плоскогубцами и загнул острые края, чтобы не поранить ногу. Получилась довольно широкая поверхность, на которую можно нажимать.

Фотка 2: https://alicorn.tk/dashie/index.php/s/LRPbdF5O9DBL 535

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

Самый первый вариант крепления: фотка 3: https://alicorn.tk/dashie/index.php/s/SA4jEyiOgFwE vWX

Учитель трудов в школе за такую халтуру поставил бы 2 или заставил бы переделывать (потому что на месте креплений внизу планка скололась; делалось всё криво, на глазок, и ничего не отшлифовано), но работать оно работает. Тем более, переделывать мне больше не на чем, т.к. дома и так хорошего дерева в дефиците.

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

Сверху леска проходит ненадёжно, так что груз-противовес срывается, если резко дёрнуть педаль. Но ничего, не проблема, делаем шилом ещё два отверстия сверху и закрепляем груз снова. Ещё укрепим вертикальные планки, чтобы они не съезжались во время работы.

Фотка 4: https://alicorn.tk/dashie/index.php/s/biXXRbjlbcfV 2s3

Итак, механическая часть готова, теперь займёмся программной. Нам понадобится любая модель Arduino, способная подключаться по USB (Uno, Nano, Mega и.т.д, в моём случае - Uno). При нажатии педали будет срабатывать датчик, который будет отлавливаться контроллером. В качестве датчика можно использовать обычную кнопку, детектор магнитного поля (геркон) или любой самодельный прибамбас, который умеет замыкать цепь. Геркон я попробовал, и это было неудобно, поэтому взял кнопку.

Arduino версий Micro и Leonardo умеет эмулировать HID-устройства, поэтому мы можем назначить пересылку любой клавиши, а решение будет кроссплатформенным. Кстати, на Windows и в графических DE вроде KDE/GNOME педаль была бы полезна для Alt+Tab или для переключения раскладки с русской на английскую.

Как позднее оказалось, Arduino Uno/Mega и им подобные требуют перепрошивки USB-контроллера, потому что родной поддержки эмуляции HID у них нет. Но мой Uno - китайский, так что нужных разъёмов для этого у него нет. Подключаться же к чипу напрямую мне боязно, потому что он, во-первых, мелкий, во-вторых, в случае кирпича восстанавливать мне его нечем (второй Uno пока у меня нет).


--------

И вот тут начинается поле деятельности для нашей смекалки. Я подумал, а что если передавать сигналы о нажатии через обычный COM-порт ардуины, затем отлавливать его с помощью специального демона и эмулировать клавиатуру на уровне ядра?

Отличная идея! Почесав репу и найдя информацию о модуле ядра под названием UHID (в Archlinux он включен по умолчанию), начал с ним ковыряться. Это было не так-то просто, поэтому пока напишем прошивку для педали.

Скетч для Arduino:

====
int detector = 13; // наш датчик для педали
int pedal_pressed = LOW;
int last_pressed = LOW;

void setup() {
  pinMode(detector, INPUT);
  Serial.begin(9600);
}

void trigger_press()   { Serial.print("on\n"); }
void trigger_release() { Serial.print("off\n"); }

void loop() {
  // нажата ли педаль в данный момент
  pedal_pressed = digitalRead(detector);

  if (pedal_pressed == HIGH && last_pressed == LOW) trigger_press();
  else if (pedal_pressed == LOW && last_pressed == HIGH) trigger_release();

  last_pressed = pedal_pressed;
  delay(100); // на всякий случай ждём 0.1 сек, дабы не делать слишком много проверок
}
====

Примеров использования для UHID в сети я практически не нашёл. Есть только один не очень исчерпывающий пример из исходников ядра Linux и кусок документации.

Интересующиеся могут ознакомиться с ними здесь:

https://git.kernel.org/pub/scm/linux/kernel/git/to rvalds/linux.git/tree/Documentation/hid/uhid.txt?i d=refs/tags/v4.10-rc3
https://git.kernel.org/pub/scm/linux/kernel/git/to rvalds/linux.git/tree/samples/uhid/uhid- example.c?id=refs/tags/v4.10-rc3

Взяв uhid-example.c из исходников ядра и поработав с ним, я добавил туда куски кода вот отсюда:  TIzgUZRrWGcQSEkKBDiP, чтобы читать данные, которые поступают из Arduino.

Код из этого исходника может пригодиться и вам, чтобы эмулировать нажатия клавиш в абсолютно любых программах. Конечно же, нужен root-доступ для запуска, но зато работать оно будет везде: и в консоли, и в Xorg.

====
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
rdesc - это магическое заклинание духа хаоса Дискорда
я узнал его, подключив к нетбуку USB-клавиатуру и посмотрев в файл
 /sys/kernel/debug/hid//rdesc, чтобы посылать аналогичные заголовки
из программы. Надо ведь как-то притворяться клавиатурой :)
*/

STATIC unsigned char rdesc[] = {
	0x05, 0x01,
	0x09, 0x06,
	0xa1, 0x01,
	0x05, 0x08,
	0x19, 0x01,
	0x29, 0x03,
	0x15, 0x00,
	0x25, 0x01,
	0x75, 0x01,
	0x95, 0x03,
	0x91, 0x02,
	0x95, 0x05,
	0x91, 0x01,
	0x05, 0x07,
	0x19, 0xe0,
	0x29, 0xe7,
	0x95, 0x08,
	0x81, 0x02,
	0x75, 0x08,
	0x95, 0x01,
	0x81, 0x01,
	0x19, 0x00,
	0x29, 0x91,
	0x26, 0xff,
	0x00, 0x95,
	0x06, 0x81,
	0x00, 0xc0
};

static int uhid_write(int fd, const struct uhid_event *ev)
{
	ssize_t ret;

	ret = write(fd, ev, sizeof(*ev));
	if (ret < 0) {
		fprintf(stderr, "Cannot write to uhid: %m\n");
		return -errno;
	} else if (ret != sizeof(*ev)) {
		fprintf(stderr, "Wrong size written to uhid: %ld != %lu\n",
			ret, sizeof(ev));
		return -EFAULT;
	} else {
		return 0;
	}
}

static int create(int fd)
{
	struct uhid_event ev;

	memset(&ev, 0, sizeof(ev));
	ev.type = UHID_CREATE;
	strcpy((char*)ev.u.create.name, "test-uhid-device");
	ev.u.create.rd_data = rdesc;
	ev.u.create.rd_size = sizeof(rdesc);
	ev.u.create.bus = BUS_USB;
	ev.u.create.vendor = 0x15d9;
	ev.u.create.product = 0x0a37;
	ev.u.create.version = 0;
	ev.u.create.country = 0;

	return uhid_write(fd, &ev);
}

static void destroy(int fd)
{
	struct uhid_event ev;

	memset(&ev, 0, sizeof(ev));
	ev.type = UHID_DESTROY;

	uhid_write(fd, &ev);
}

static int event(int fd)
{
	struct uhid_event ev;
	ssize_t ret;

	memset(&ev, 0, sizeof(ev));
	ret = read(fd, &ev, sizeof(ev));
	if (ret == 0) {
		fprintf(stderr, "Read HUP on uhid-cdev\n");
		return -EFAULT;
	} else if (ret < 0) {
		fprintf(stderr, "Cannot read uhid-cdev: %m\n");
		return -errno;
	} else if (ret != sizeof(ev)) {
		fprintf(stderr, "Invalid size read from uhid-dev: %ld != %lu\n",
			ret, sizeof(ev));
		return -EFAULT;
	}

	switch (ev.type) {
	case UHID_START:
		fprintf(stderr, "UHID_START from uhid-dev\n");
		break;
	case UHID_STOP:
		fprintf(stderr, "UHID_STOP from uhid-dev\n");
		break;
	case UHID_OPEN:
		fprintf(stderr, "UHID_OPEN from uhid-dev\n");
		break;
	case UHID_CLOSE:
		fprintf(stderr, "UHID_CLOSE from uhid-dev\n");
		break;
	case UHID_OUTPUT:
		fprintf(stderr, "UHID_OUTPUT from uhid-dev\n");
		break;
	case UHID_OUTPUT_EV:
		fprintf(stderr, "UHID_OUTPUT_EV from uhid-dev\n");
		break;
	default:
		fprintf(stderr, "Invalid event from uhid-dev: %u\n", ev.type);
	}

	return 0;
}

static char ctrl_down = 0;

static int send_event(int fd)
{
  struct uhid_event ev;
  memset(&ev, 0, sizeof(ev));
  ev.type = UHID_INPUT;
  ev.u.input.size = 9;

  // вот это та самая хрень, которая делает виртуальное нажатие
  // первый элемент массива data - это клавиши-модификаторы
  // 0 - это их отсутствие (в данном случае для key_release)
  // а единичка - это как раз левый Ctrl

  ev.u.input.data[0] = ctrl_down;
  ev.u.input.data[1] = 0x0;

  return uhid_write(fd, &ev);
}

int main(int argc, char **argv)
{
	int fd;
	const char *path = "/dev/uhid";
	struct pollfd pfds[2];
	int ret, r;
	struct termios state;
	char serialbuf[5];

	ret = tcgetattr(STDIN_FILENO, &state);
	if (ret) {
		fprintf(stderr, "Cannot get tty state\n");
	} else {
		state.c_lflag &= ~ICANON;
		state.c_cc[VMIN] = 1;
		ret = tcsetattr(STDIN_FILENO, TCSANOW, &state);
		if (ret)
			fprintf(stderr, "Cannot set tty state\n");
	}

	fprintf(stderr, "Open uhid-cdev %s\n", path);
	fd = open(path, O_RDWR | O_CLOEXEC);
	if (fd < 0) {
		fprintf(stderr, "Cannot open uhid-cdev %s: %m\n", path);
		return EXIT_FAILURE;
	}

	fprintf(stderr, "Create uhid device\n");
	ret = create(fd);
	if (ret) {
		close(fd);
		return EXIT_FAILURE;
	}

	pfds[0].fd = STDIN_FILENO;
	pfds[0].events = POLLIN;
	pfds[1].fd = fd;
	pfds[1].events = POLLIN;

	int device_fd = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_NDELAY);
	if (fd == -1) {
		perror("open_port: Unable to open /dev/ttyUSB0 - ");
		return 1;
	} else {
		fcntl(device_fd, F_SETFL, FNDELAY);
	}
	
	while (1) {
		ret = poll(pfds, 2, -1);
		r = read(device_fd, serialbuf, 5); // получаем данные с педали
		
		if (ret < 0) {
			fprintf(stderr, "Cannot poll for fds: %m\n");
			break;
		}
		if (pfds[0].revents & POLLHUP) {
			fprintf(stderr, "Received HUP on stdin\n");
			break;
		}
		if (pfds[1].revents & POLLHUP) {
			fprintf(stderr, "Received HUP on uhid-cdev\n");
			break;
		}

		if (pfds[0].revents & POLLIN) {
		  // проверка поступающих данных с ардуины
		  if (r > 0 && strncmp(serialbuf, "on\n", 3) == 0) {
		    ctrl_down = 0;
		    send_event(fd);
		    memset(&serialbuf, 0, 5); // очищаем буфер
		  }
		  else if (r > 0 && strncmp(serialbuf, "off\n", 4) == 0) {
		    ctrl_down = 1;
		    send_event(fd);
		    memset(&serialbuf, 0, 5);
		  }
		}
		if (pfds[1].revents & POLLIN) {
			ret = event(fd);
			if (ret)
				break;
		}
	}

	fprintf(stderr, "Destroy uhid device\n");
	destroy(fd);
	return EXIT_SUCCESS;
}
====

Всё что остаётся - это подключить нашу педаль по USB и запустить скомпилированный бинарник из-под рута.

Сейчас я пишу это сообщение в Emacs с использованием педали. Вполне неплохо работает. Вот видите - даже из банки тушёнки можно что-нибудь полезное запилить :)

В качестве бонуса выкладываю найденный на просторах сети PDF со стандартом на HID-устройства. Любые непонятные моменты там можно уточнить, это очень годный документ: https://alicorn.tk/dashie/index.php/s/dISkfEraH8xV gDm
Первые 5 страниц - вода, читать с 6.

From: Andrew Lobanov (tavern,1) 15.09.17 08:49 UTC
To: All
Subject: Вопрос по golang
Есть затея сохранять слайс из структур в файл:

====
package main

import (
    "encoding/gob"
    "os"
    "fmt"
)

type count struct {
    echo string
    count int
}

func main() {
    d := []count{{"bash.rss", 100}, {"pipe.2032", 200}}
    fmt.Println(d)
    f, _ := os.Create("slice")
    encoder := gob.NewEncoder(f)
    encoder.Encode(d)
    f.Close()
}
====

Файл вполне себе создаётся.

А вот считать из этого файла у меня не выходит:

====
package main

import (
    "os"
    "encoding/gob"
    "fmt"
)

type count struct {
    echo string
    count int
}

func main() {
    d := []count{}
    f, _ := os.Open("slice")
    encoder := gob.NewDecoder(f)
    _ = encoder.Decode(d)
    fmt.Println(d)
    f.Close()
}
====

В итоге в d после декодирования вижу пустой слайс. Что я делаю не так?

Reply to: IsnvwnNyybeGw5rVyoXr
From: Difrex (mira, 14) 15.09.17 13:05 UTC
To: Difrex
Subject: Re: Вопрос по golang
Не прочитал код сначала =)

Игнорируй пост про жсон

Reply to: GRiVJ3504FzoILlE2eE5
From: Difrex (mira, 14) 15.09.17 12:53 UTC
To: Andrew Lobanov
Subject: Re: Вопрос по golang
Сделай так
====
type count struct {
    echo string `json:"echo"`
    count int `json:"count"`
}
====

Потом маршаль его и пиши в файл json. После считывания анмаршал делай.

====
var c []count
err := json.Unmarshal(data, &c)
====

Reply to: GRiVJ3504FzoILlE2eE5
From: Difrex (mira, 14) 15.09.17 13:04 UTC
To: Andrew Lobanov
Subject: Re: Вопрос по golang
Тут ссылку нужно передать
_ = encoder.Decode(&d)

Reply to: IsnvwnNyybeGw5rVyoXr
From: Difrex (mira, 14) 15.09.17 14:55 UTC
To: Difrex
Subject: Re: Вопрос по golang
Ну и ошибку лучше обрабатывать все же.

Reply to: GXFLinPrhH7wtzPE5o3B
From: Andrew Lobanov (tavern,1) 16.09.17 11:33 UTC
To: Difrex
Subject: Re: Вопрос по golang
Difrex> Потом маршаль его и пиши в файл json. После считывания анмаршал делай.

json у меня как крайний вариант.

Reply to: IsnvwnNyybeGw5rVyoXr
From: Andrew Lobanov (tavern,1) 16.09.17 11:33 UTC
To: Difrex
Subject: Re: Вопрос по golang
Difrex> Тут ссылку нужно передать
Difrex> _ = encoder.Decode(&d)

Да. Я там нагуглил потом. Но один фиг пустой слайс на выходе.

Reply to: Vk1w7zOnEa4AzIMrjYQ0
From: Andrew Lobanov (tavern,1) 16.09.17 11:33 UTC
To: Difrex
Subject: Re: Вопрос по golang
Difrex> Ну и ошибку лучше обрабатывать все же.

Это тестовый пример. В ошибку попадает EOF, так что заведомо всё нормально. Вот поему слайс пустой я не пойму.

Reply to: sbJMCSk1XszUzmQzKiz1
From: Difrex(mobile) (tavern,23) 16.09.17 11:50 UTC
To: Andrew Lobanov
Subject: Re: Вопрос по golang
А какая версия го?

Вечером попробую у себя воспроизвести.

ЗЫ: приехал в Москву. Отвык я уже от метро 😀

Reply to: voPqaUsYaTZvyAph4kAe
From: Andrew Lobanov (tavern,1) 16.09.17 14:12 UTC
To: Difrex(mobile)
Subject: Re: Вопрос по golang
Difrex(mobile)> А какая версия го?

1.9

Difrex(mobile)> Вечером попробую у себя воспроизвести.

Буду признателен.

Difrex(mobile)> ЗЫ: приехал в Москву. Отвык я уже от метро.

А я ни разу на метро не ездил. В Екатеринбурге, когда ездил на курсы по MS SQL Server, на нём можно было доехать от вокзала до гостинницы и обратно, но я предпочёл лишний ачсок пешком прогуляться.

Reply to: AZqu3rzB87sHAtRiQ0VR
From: Difrex(mobile) (tavern,23) 16.09.17 17:10 UTC
To: Andrew Lobanov
Subject: Re: Вопрос по golang
Тут пешочком не прогуляться. Мне от дома до дома родителей час на машине ехать. Вот еду обратно в метро. Метро быстро!

Reply to: SnYx5oDmYgyobCZvjxiv
From: Difrex (mira, 14) 16.09.17 20:27 UTC
To: Difrex
Subject: Re: Вопрос по golang
Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

Reply to: AZqu3rzB87sHAtRiQ0VR
From: Difrex (mira, 14) 16.09.17 20:25 UTC
To: Andrew Lobanov
Subject: Re: Вопрос по golang
Вот так вот работает все
====
package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Count struct {
	Echo  string
	Count int
}

func main() {
	d := []Count{{"eee", 1}}
	f, _ := os.Create("slice")
	enc := gob.NewEncoder(f)
	enc.Encode(d)
	f.Close()

	var c []Count
	s, _ := os.Open("slice")
	dec := gob.NewDecoder(s)
	dec.Decode(&c)
	defer s.Close()
	fmt.Println(c)
}
====

====
go build
./test 
[{eee 1}]

====

Reply to: B6RhUJDFQiOonlZh9psf
From: Andrew Lobanov (tavern,1) 17.09.17 07:59 UTC
To: Difrex
Subject: Re: Вопрос по golang
Difrex> Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

Да. Дело оказалось именно в этом. Спасибо за помощь.

From: Difrex (mira, 14) 28.09.17 09:08 UTC
To: All
Subject: Нужна помощь по программированию под емакс
Привет.

Вот я пишу программку, хочу опакетить ее. Делаю в конце

(provide 'my-prog)

В емаксе добавляю каталог в load-path, делаю require. Вопрос: как достучатьс до функций из пакета?

Reply to: ZBKyXbUEPJOAGC7LLG8b
From: Andrew Lobanov (,1) 28.09.17 10:06 UTC
To: Difrex
Subject: Re: Нужна помощь по программированию под емакс
Difrex> Привет.
Difrex> Вот я пишу программку, хочу опакетить ее. Делаю в конце
Difrex> (provide 'my-prog)
Difrex> В емаксе добавляю каталог в load-path, делаю require. Вопрос: как достучатьс до функций из пакета?

Не очень понял что значит "достучаться". Если вызывать их из других программ, то они сразу доступны по имени. Если имеется в виду интерактивный вызов, то надо использовать специальную форму (interactive &optional ARG-DESCRIPTOR). Подробнее можно прочитать во встроенной справке "C-h f interactive RET".

;;; Йу-ху! С каждым днём имаксеров становится всё больше =)

Reply to: zNnrFaZ52YFLtbFYgw4i
From: Difrex (mira, 14) 28.09.17 11:00 UTC
To: Andrew Lobanov
Subject: Re: Нужна помощь по программированию под емакс
>Если имеется в виду интерактивный вызов, то надо использовать специальную форму (interactive &optional ARG-DESCRIPTOR). Подробнее можно прочитать во встроенной справке "C-h f interactive RET".
Спасибо! То, что нужно.

>;;; Йу-ху! С каждым днём имаксеров становится всё больше =)
Да я уже года полтора, как емаксом пользуюсь, просто не писал под него =)

Reply to: RbG0SGCvQKhrQToMNDym
From: Difrex (mira, 14) 28.09.17 14:16 UTC
To: Difrex
Subject: Re: Нужна помощь по программированию под емакс
В общем начал я пилить клиента под емакс. Пока удалось сделать только получение списка эх. Но думаю потом дело пойдет быстрее.

Если кто готов присоедениться - велком https://gitea.difrex.ru/Difrex/idec.el

Reply to: BYTfEPDksO7BKlHYfDCA
From: Andrew Lobanov (,1) 28.09.17 15:03 UTC
To: Difrex
Subject: Re: Нужна помощь по программированию под емакс
Difrex> В общем начал я пилить клиента под емакс. Пока удалось сделать только получение списка эх. Но думаю потом дело пойдет быстрее.
Difrex> Если кто готов присоедениться - велком https://gitea.difrex.ru/Difrex/idec.el

О! Крутота. Я неоднократно начинал, но забрасывал. А я go осваиваю потихоньку =)

Reply to: P3def4UobnhUcT5h2m98
From: Difrex(mobile) (tavern,23) 03.10.17 20:37 UTC
To: Andrew Lobanov
Subject: Re: Нужна помощь по программированию под емакс
А ты не мог бы подсказать как мне сделать такую штуку, как список из ассоциативных массивов.

Делаю сейчас так:

====
(setq new-messages-list (-concat 'new-messages-list '((content . message-content) (id . msg))))
====

Потом пытаюсь пройтись по этому списку:
====
(dolist (msg new-messages-list)
        (message (assoc 'id msg)))
====

Но не работает. Ругается так: Wrong type argument: listp

Reply to: R9RXOzz9Y3P37gSYScCf
From: Difrex(mobile) (tavern,23) 03.10.17 21:41 UTC
To: Difrex(mobile)
Subject: Re: Нужна помощь по программированию под емакс
Переделал на хэшики - все работает =)

Reply to: R9RXOzz9Y3P37gSYScCf
From: Andrew Lobanov (Go!,1) 04.10.17 05:13 UTC
To: Difrex(mobile)
Subject: Re: Нужна помощь по программированию под емакс
Difrex(mobile)> А ты не мог бы подсказать как мне сделать такую штуку, как список из ассоциативных массивов.
Difrex(mobile)> Делаю сейчас так:
Difrex(mobile)> ====
Difrex(mobile)> (setq new-messages-list (-concat 'new-messages-list '((content . message-content) (id . msg))))
Difrex(mobile)> ====
Difrex(mobile)> Потом пытаюсь пройтись по этому списку:
Difrex(mobile)> ====
Difrex(mobile)> (dolist (msg new-messages-list)
Difrex(mobile)> (message (assoc 'id msg)))
Difrex(mobile)> ====
Difrex(mobile)> Но не работает. Ругается так: Wrong type argument: listp

Вот я не помню как в emacs lisp работают property lists. Я делал простой список списков со структурой ((msgid body) (msgid body)) и обкодил список, обращаясь к элементам посредством (first...) и (second...). Решение кривое, но рабочее и с учётом статичности структуры данных, в целом, приемлемое.

Reply to: eaNfbC6ERLOR3zuzPq9l
From: Andrew Lobanov (Go!,1) 04.10.17 05:13 UTC
To: Difrex(mobile)
Subject: Re: Нужна помощь по программированию под емакс
Difrex(mobile)> Переделал на хэшики - все работает =)

Можешь накидать примерчик? Интересно а то.

Reply to: a7e0Guhl6TX7hIyf1saG
From: Difrex (mira, 14) 04.10.17 08:32 UTC
To: Andrew Lobanov
Subject: Re: Нужна помощь по программированию под емакс
Как-то так:

====
(setq new-messages-list (make-hash-table :test 'equal))
(dolist (m my-list)
  ...
  (puthash msg message-content new-messages-list)
)

(maphash (lambda (id msg)
  (message (concat "Get " id "\n" msg))
 new-messages-list)
====

Тут инициализируется хэш
https://gitea.difrex.ru/Difrex/idec.el/src/researc h/idec.el#L315

Тут заполняется
https://gitea.difrex.ru/Difrex/idec.el/src/researc h/idec.el#L417

Тут выводится
https://gitea.difrex.ru/Difrex/idec.el/src/researc h/idec.el#L369

From: Difrex(mobile) (tavern,23) 05.12.17 12:40 UTC
To: All
Subject: Фреймворки жабаскрипта
А какие сейчас актуальные есть?
Чтобы просто было, без компилятора, бовера бандлеа и прочих штук.

Пока склоняюсь к vue.js, но прислушаюсь к советам.

From: Peter (syscall,1) 09.12.17 19:14 UTC
To: All
Subject: Очарован GO
Начал изучать go. И должен сказать, я очарован:

1) простотой синтаксиса (такой же простой, как в C);
2) простотой кросс-компиляции для разных платформ (без мороки с кросс средами);
3) дает плюшки скриптовых языков и вместе с тем это КОМПИЛЯТОР!
4) классный талисман =)

Сейчас мне кажется, что это может стать моим рабочим инструментом, помимо C и Lua.

Буду изучать дальше!

P.S. Кто еще заценил эту штуку? :)

Reply to: Nbo8KyKAojUpwe2XORzQ
From: Difrex(mobile) (tavern,23) 10.12.17 17:32 UTC
To: Peter
Subject: Re: Очарован GO
Я пишу на Go. Он классный :)

Reply to: Nbo8KyKAojUpwe2XORzQ
From: Andrew Lobanov (Go!,1) 11.12.17 04:38 UTC
To: Peter
Subject: Re: Очарован GO
Peter> P.S. Кто еще заценил эту штуку? :)

Язык и правда замечательный. Меня очень радует что во время засилия раздутых языков с тоннами синтаксического сахара и развесистым синтаксисом сравнительно недавно появился такой замечательный язык. Конечно, результат не очень быстрый на фоне C и многих других компилируемых языков, но это окупается удобством разработки и куда большей производительностью в сравнении с популярными интерпретируемыми языками.

Да. Маскот крайне классный ещё. Согласен.

1 . . . 4 5 6