RSS
Pages: 1 2 3 4 5 6 7 8 9 10
[>] Re: Git
develop.16
vit01(mira, 1) — Andrew Lobanov
2017-03-13 07:49:33


AL> А ещё бы полноценный git-клиент под андроид. А то в маршрутке приходится книги читать, а мог бы тратить это время на написание игрушки на инстеде. Писать есть чем вполне сносно, а вот потом пушить изменения нечем.

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

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

[>] Re: Git
develop.16
Andrew Lobanov(Go!,0) — vit01
2017-03-13 10:26:36


AL>> А ещё бы полноценный git-клиент под андроид. А то в маршрутке приходится книги читать, а мог бы тратить это время на написание игрушки на инстеде. Писать есть чем вполне сносно, а вот потом пушить изменения нечем.
vit01> Порекомендую клиент MGit или его предшественника (по форку) SGit. И коммитить, и пушить, и всё остальное необходимое умеет.
vit01> https://f-droid.org/repository/browse/?fdfilter=MGit&fdid=com.manichord.mgit

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

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

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

[>] Web и длинные ссылки
develop.16
Andrew Lobanov(tavern,1) — All
2017-05-07 09:56:21


Есть div, у него задана ширина в процентах от вьюпорта, внутри длинная-длинная ссылка. Ссылка переносится, но только один раз, а потом растягивает этот div за пределы экрана. Как это можно забороть? Есть опыт?

[>] Re: Web и длинные ссылки
develop.16
Andrew Lobanov(tavern,1) — All
2017-05-07 10:15:38


> Есть div, у него задана ширина в процентах от вьюпорта, внутри длинная-длинная ссылка. Ссылка переносится, но только один раз, а потом растягивает этот div за пределы экрана. Как это можно забороть? Есть опыт?

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

word-break: break-all;

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

[>] Книги!
develop.16
Difrex(mira, 14) — All
2017-05-23 15:24:43


Зацените, что нашел https://github.com/miguellgt/books

[>] Re: Книги!
develop.16
vit01(mira, 1) — Difrex
2017-05-23 15:50:43


Интересно, интересно.
Целый набор "современного" девелопера. Куча джаваскрипта, новомодные angular и react, микросервисы (какой ужас, столько страшилок про них!), а также незаменимый Докер. Зачем туда закинули agile и tdd, вообще без понятия.

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

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

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

[>] Машина снов на Arduino своими руками
develop.16
vit01(mira, 1) — All
2017-06-22 13:27:52


Прочитал в интернете недавно про такую штуку как машина сновидений. Грубо говоря, это картонный вращающийся цилиндр вокруг источника света, с прорезями, создающий мерцание частотой 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

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

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

[>] Re: Машина снов на Arduino своими руками
develop.16
vit01(mira, 1) — vit01
2017-06-25 18:47:05


Усовершенствовал девайс, добавив туда второй светодиод и поменяв мою любимую для дебага 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 за эту статью.

[>] Re: Машина снов на Arduino своими руками
develop.16
vit01(mira, 1) — vit01
2017-06-26 16:51:48


Андрей попросил видео сабжа в действии. Вот оно:

https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVSH5U

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

[>] Требуется сервер
develop.16
vit01(mira, 1) — All
2017-06-27 17:03:52


Товарищи, нужна ваша консультация.

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

Хочу заказать хороший, годный 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 рублей в месяц. Можно меньше.

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

[>] Re: Требуется сервер
develop.16
Difrex(mira, 14) — vit01
2017-06-27 18:01:22


firstbyte.ru

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

[>] Re: Требуется сервер
develop.16
vit01(mira, 1) — Difrex
2017-06-27 18:45:46


Difrex> firstbyte.ru

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

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

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

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

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

[>] Re: Машина снов на Arduino своими руками
develop.16
Andrew Lobanov(tavern,1) — vit01
2017-06-27 19:12:48


vit01> Андрей попросил видео сабжа в действии. Вот оно:
vit01> https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVSH5U
vit01> Ничего интересного здесь нет (тем более, плохонькая камера мобильника не может запечатлеть эту игру света), но просто как факт.

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

[>] Re: Машина снов на Arduino своими руками
develop.16
btimofeev(tavern,13) — vit01
2017-06-27 19:42:48


vit01>> Андрей попросил видео сабжа в действии. Вот оно:
vit01>> https://alicorn.tk/dashie/index.php/s/4PZLyfKTDDVSH5U

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

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

[>] Re: Машина снов на Arduino своими руками
develop.16
vit01(mira, 1) — btimofeev
2017-06-28 15:09:30


btimofeev> А эффект от этого реально какой-то есть?

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

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

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

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

[>] Re: Требуется сервер
develop.16
Difrex(mira, 14) — vit01
2017-06-28 16:07:40


>У них самый выгодный тариф - это за 399р. дают 2 гига ОЗУ и 40 гигов места.
MSK-highmem-KVM-SAS-2 439р
* 2CPU
* 4Gb RAM
* 60Gb HDD

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

[>] Re: Требуется сервер
develop.16
vit01(mira, 1) — Difrex
2017-06-28 18:48:58


Difrex> MSK-highmem-KVM-SAS-2 439р

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

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

[>] IDEC Mobile: кодинг в прямом эфире
develop.16
vit01(mira, 1) — All
2017-06-29 07:09:57


Надоели скучные сериалы и реалити-шоу? Хочется посмотреть на эпик-мега-экшен?

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

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

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

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

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

[>] Re: IDEC Mobile: кодинг в прямом эфире
develop.16
Difrex(mira, 14) — vit01
2017-06-29 16:01:56


О, круто! =)

[>] Re: IDEC Mobile: кодинг в прямом эфире
develop.16
vit01(mira, 1) — Difrex
2017-06-30 17:08:37


Кстати, как ни странно, пробросить порт дебага через ssh на удалёнку и набрать adb connect localhost субъективно кажется менее напряжным, чем возиться с проводами и подключением по локалке =)

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

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

[>] Stringlate - перевод Android-приложений в два клика
develop.16
vit01(mira, 1) — All
2017-07-10 19:00:30


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

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

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

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

[>] [DIY] Как банка тушёнки улучшит жизнь в Vim & Emacs
develop.16
vit01(mira, 1) — All
2017-07-16 09:21:54


Прочитав статью на Хабре про педалирование Vim ( https://habrahabr.ru/post/232177 ), я загорелся идеей сделать себе самодельную педальку для текстовых редакторов.
Как из того анекдота про педаль для Emacs, чтобы Ctrl зажимать, только уже не как анекдот, а на самом деле.

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

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

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

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

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

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

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

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

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

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

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

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

Итак, механическая часть готова, теперь займёмся программной. Нам понадобится любая модель 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/torvalds/linux.git/tree/Documentation/hid/uhid.txt?id=refs/tags/v4.10-rc3
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/samples/uhid/uhid-example.c?id=refs/tags/v4.10-rc3

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

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

#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <linux/uhid.h>

/*
rdesc - это магическое заклинание духа хаоса Дискорда
я узнал его, подключив к нетбуку USB-клавиатуру и посмотрев в файл
 /sys/kernel/debug/hid/<dev>/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/dISkfEraH8xVgDm
Первые 5 страниц - вода, читать с 6.

[>] Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — All
2017-09-15 09:49:01


Есть затея сохранять слайс из структур в файл:

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 после декодирования вижу пустой слайс. Что я делаю не так?

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Difrex
2017-09-15 14:05:49


Не прочитал код сначала =)

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

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Andrew Lobanov
2017-09-15 13:53:50


Сделай так
type count struct {
    echo string `json:"echo"`
    count int `json:"count"`
}

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

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

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Andrew Lobanov
2017-09-15 14:04:45


Тут ссылку нужно передать
_ = encoder.Decode(&d)

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Difrex
2017-09-15 15:55:49


Ну и ошибку лучше обрабатывать все же.

[>] Re: Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:00


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

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

[>] Re: Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:00


Difrex> Тут ссылку нужно передать
Difrex> _ = encoder.Decode(&d)

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

[>] Re: Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:01


Difrex> Ну и ошибку лучше обрабатывать все же.

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

[>] Re: Вопрос по golang
develop.16
Difrex(mobile)(tavern,23) — Andrew Lobanov
2017-09-16 12:50:17


А какая версия го?

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

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

[>] Re: Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — Difrex(mobile)
2017-09-16 15:12:36


Difrex(mobile)> А какая версия го?

1.9

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

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

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

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

[>] Re: Вопрос по golang
develop.16
Difrex(mobile)(tavern,23) — Andrew Lobanov
2017-09-16 18:10:37


Тут пешочком не прогуляться. Мне от дома до дома родителей час на машине ехать. Вот еду обратно в метро. Метро быстро!

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Difrex
2017-09-16 21:27:33


Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

[>] Re: Вопрос по golang
develop.16
Difrex(mira, 14) — Andrew Lobanov
2017-09-16 21:25:58


Вот так вот работает все
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}]


[>] Re: Вопрос по golang
develop.16
Andrew Lobanov(tavern,1) — Difrex
2017-09-17 08:59:07


Difrex> Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

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

[>] Нужна помощь по программированию под емакс
develop.16
Difrex(mira, 14) — All
2017-09-28 10:08:57


Привет.

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

(provide 'my-prog)

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Andrew Lobanov(,1) — Difrex
2017-09-28 11:06:02


Difrex> Привет.
Difrex> Вот я пишу программку, хочу опакетить ее. Делаю в конце
Difrex> (provide 'my-prog)
Difrex> В емаксе добавляю каталог в load-path, делаю require. Вопрос: как достучатьс до функций из пакета?

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

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Difrex(mira, 14) — Andrew Lobanov
2017-09-28 12:00:17


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

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Difrex(mira, 14) — Difrex
2017-09-28 15:16:07


В общем начал я пилить клиента под емакс. Пока удалось сделать только получение списка эх. Но думаю потом дело пойдет быстрее.

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Andrew Lobanov(,1) — Difrex
2017-09-28 16:03:47


Difrex> В общем начал я пилить клиента под емакс. Пока удалось сделать только получение списка эх. Но думаю потом дело пойдет быстрее.
Difrex> Если кто готов присоедениться - велком https://gitea.difrex.ru/Difrex/idec.el

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Difrex(mobile)(tavern,23) — Andrew Lobanov
2017-10-03 21:37:37


А ты не мог бы подсказать как мне сделать такую штуку, как список из ассоциативных массивов.

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

(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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Difrex(mobile)(tavern,23) — Difrex(mobile)
2017-10-03 22:41:24


Переделал на хэшики - все работает =)

[>] Re: Нужна помощь по программированию под емакс
develop.16
Andrew Lobanov(Go!,1) — Difrex(mobile)
2017-10-04 06:13:02


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...). Решение кривое, но рабочее и с учётом статичности структуры данных, в целом, приемлемое.

[>] Re: Нужна помощь по программированию под емакс
develop.16
Andrew Lobanov(Go!,1) — Difrex(mobile)
2017-10-04 06:13:02


Difrex(mobile)> Переделал на хэшики - все работает =)

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

[>] Re: Нужна помощь по программированию под емакс
develop.16
Difrex(mira, 14) — Andrew Lobanov
2017-10-04 09:32:01


Как-то так:

(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/research/idec.el#L315

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

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

[>] Фреймворки жабаскрипта
develop.16
Difrex(mobile)(tavern,23) — All
2017-12-05 12:40:09


А какие сейчас актуальные есть?
Чтобы просто было, без компилятора, бовера бандлеа и прочих штук.

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

[>] Очарован GO
develop.16
Peter(syscall,1) — All
2017-12-09 19:14:32


Начал изучать go. И должен сказать, я очарован:

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

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

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

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

[>] Re: Очарован GO
develop.16
Difrex(mobile)(tavern,23) — Peter
2017-12-10 17:32:58


Я пишу на Go. Он классный :)

[>] Re: Очарован GO
develop.16
Andrew Lobanov(Go!,1) — Peter
2017-12-11 04:38:16


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

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

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

Pages: 1 2 3 4 5 6 7 8 9 10