Сообщения в develop.16

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/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
Difrex to Andrew Lobanov (2017-10-04 08:32:01) [ссылка]

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...). Решение кривое, но рабочее и с учётом статичности структуры данных, в целом, приемлемое.
Andrew Lobanov to Difrex(mobile) (2017-10-04 05:13:02) [ссылка]

Re: Нужна помощь по программированию под емакс

Ответ на сообщение
Difrex(mobile)> Переделал на хэшики - все работает =)
Можешь накидать примерчик? Интересно а то.
Andrew Lobanov to Difrex(mobile) (2017-10-04 05:13:02) [ссылка]

Re: Нужна помощь по программированию под емакс

Ответ на сообщение
Переделал на хэшики - все работает =)
Difrex(mobile) to Difrex(mobile) (2017-10-03 21:41:24) [ссылка]

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
Difrex(mobile) to Andrew Lobanov (2017-10-03 20:37:37) [ссылка]

Re: Нужна помощь по программированию под емакс

Ответ на сообщение
Difrex> В общем начал я пилить клиента под емакс. Пока удалось сделать только получение списка эх. Но думаю потом дело пойдет быстрее.
Difrex> Если кто готов присоедениться - велком https://gitea.difrex.ru/Difrex/idec.el
О! Крутота. Я неоднократно начинал, но забрасывал. А я go осваиваю потихоньку =)
Andrew Lobanov to Difrex (2017-09-28 15:03:47) [ссылка]

Re: Нужна помощь по программированию под емакс

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

Если кто готов присоедениться - велком https://gitea.difrex.ru/Difrex/idec.el
Difrex to Difrex (2017-09-28 14:16:07) [ссылка]

Re: Нужна помощь по программированию под емакс

Ответ на сообщение
>Если имеется в виду интерактивный вызов, то надо использовать специальную форму (interactive &optional ARG-DESCRIPTOR). Подробнее можно прочитать во встроенной справке "C-h f interactive RET".
Спасибо! То, что нужно.
>;;; Йу-ху! С каждым днём имаксеров становится всё больше =)
Да я уже года полтора, как емаксом пользуюсь, просто не писал под него =)
Difrex to Andrew Lobanov (2017-09-28 11:00:17) [ссылка]

Re: Нужна помощь по программированию под емакс

Ответ на сообщение
Difrex> Привет.
Difrex> Вот я пишу программку, хочу опакетить ее. Делаю в конце
Difrex> (provide 'my-prog)
Difrex> В емаксе добавляю каталог в load-path, делаю require. Вопрос: как достучатьс до функций из пакета?
Не очень понял что значит "достучаться". Если вызывать их из других программ, то они сразу доступны по имени. Если имеется в виду интерактивный вызов, то надо использовать специальную форму (interactive &optional ARG-DESCRIPTOR). Подробнее можно прочитать во встроенной справке "C-h f interactive RET".

;;; Йу-ху! С каждым днём имаксеров становится всё больше =)
Andrew Lobanov to Difrex (2017-09-28 10:06:02) [ссылка]

Нужна помощь по программированию под емакс

Привет.

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

(provide 'my-prog)

В емаксе добавляю каталог в load-path, делаю require. Вопрос: как достучатьс до функций из пакета?
Difrex to All (2017-09-28 09:08:57) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Difrex> Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data
Да. Дело оказалось именно в этом. Спасибо за помощь.
Andrew Lobanov to Difrex (2017-09-17 07:59:07) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data
Difrex to Difrex (2017-09-16 20:27:33) [ссылка]

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}]

Difrex to Andrew Lobanov (2017-09-16 20:25:58) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Тут пешочком не прогуляться. Мне от дома до дома родителей час на машине ехать. Вот еду обратно в метро. Метро быстро!
Difrex(mobile) to Andrew Lobanov (2017-09-16 17:10:37) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Difrex(mobile)> А какая версия го?
1.9
Difrex(mobile)> Вечером попробую у себя воспроизвести.
Буду признателен.
Difrex(mobile)> ЗЫ: приехал в Москву. Отвык я уже от метро.
А я ни разу на метро не ездил. В Екатеринбурге, когда ездил на курсы по MS SQL Server, на нём можно было доехать от вокзала до гостинницы и обратно, но я предпочёл лишний ачсок пешком прогуляться.
Andrew Lobanov to Difrex(mobile) (2017-09-16 14:12:36) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
А какая версия го?

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

ЗЫ: приехал в Москву. Отвык я уже от метро 😀
Difrex(mobile) to Andrew Lobanov (2017-09-16 11:50:17) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Difrex> Ну и ошибку лучше обрабатывать все же.
Это тестовый пример. В ошибку попадает EOF, так что заведомо всё нормально. Вот поему слайс пустой я не пойму.
Andrew Lobanov to Difrex (2017-09-16 11:33:01) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Difrex> Потом маршаль его и пиши в файл json. После считывания анмаршал делай.
json у меня как крайний вариант.
Andrew Lobanov to Difrex (2017-09-16 11:33:00) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Difrex> Тут ссылку нужно передать
Difrex> _ = encoder.Decode(&d)
Да. Я там нагуглил потом. Но один фиг пустой слайс на выходе.
Andrew Lobanov to Difrex (2017-09-16 11:33:00) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Ну и ошибку лучше обрабатывать все же.
Difrex to Difrex (2017-09-15 14:55:49) [ссылка]

Re: Вопрос по golang

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

Игнорируй пост про жсон
Difrex to Difrex (2017-09-15 13:05:49) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Тут ссылку нужно передать
_ = encoder.Decode(&d)
Difrex to Andrew Lobanov (2017-09-15 13:04:45) [ссылка]

Re: Вопрос по golang

Ответ на сообщение
Сделай так
type count struct {
    echo string `json:"echo"`
    count int `json:"count"`
}
Потом маршаль его и пиши в файл json. После считывания анмаршал делай.
var c []count
err := json.Unmarshal(data, &c)
Difrex to Andrew Lobanov (2017-09-15 12:53:50) [ссылка]

Вопрос по 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 после декодирования вижу пустой слайс. Что я делаю не так?
Andrew Lobanov to All (2017-09-15 08:49:01) [ссылка]

[DIY] Как банка тушёнки улучшит жизнь в Vim & Emacs

Прочитав статью на Хабре про педалирование 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 
#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/dISkfEraH8xVgDm
Первые 5 страниц - вода, читать с 6.
vit01 to All (2017-07-16 08:21:54) [ссылка]

Stringlate - перевод Android-приложений в два клика

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

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

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

Потом можно спокойно править переводы через удобный GUI. После окончания работы можно экспортировать результат в файл, поделиться им по Email или сразу открыть Pull Request/Issue в репозитории. Рекомендую и одобряю.
vit01 to All (2017-07-10 18:00:30) [ссылка]

Re: IDEC Mobile: кодинг в прямом эфире

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

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

P.S. Кодинг-эксгибиционизм-шоу до сих пор идёт. Кому хочется (и тому, кто может в андроид), могу даже RW-пароль скинуть
vit01 to Difrex (2017-06-30 16:08:37) [ссылка]

Re: IDEC Mobile: кодинг в прямом эфире

Ответ на сообщение
О, круто! =)
Difrex to vit01 (2017-06-29 15:01:56) [ссылка]

IDEC Mobile: кодинг в прямом эфире

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

Смотреть немое кино бесплатно без смс и регистрации:
$ vncviewer -Shared -ViewOnly debug.ii-net.tk:5901
Юзер debug
Пароль 303045

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

1. Андроид студия - главная героиня шоу. Обаятельная, привлекательная, но иногда очень капризная и упёртая свол^W IDE.
2. Виртуальный Android 4.4 - надёжный и неприхотливый эмулятор, который через годика два выйдет на пенсию. Обладает загадочным характером, будет периодически появляться и исчезать
3. Курсор мыши. Часто бездельничает, но иногда тыкает по кнопкам, бегает по спагетти-быдлокоду и выделяет текст.
4. Терминал. Всегда в своём репертуаре. Отображает белый текст на чёрном фоне.
vit01 to All (2017-06-29 06:09:57) [ссылка]

Re: Требуется сервер

Ответ на сообщение
Difrex> MSK-highmem-KVM-SAS-2 439р
Ой, я невнимательно просмотрел каталог :)

Спасибо за рекомендацию, заказал именно этот вариант, уже получил рута и пробую настраивать.
vit01 to Difrex (2017-06-28 17:48:58) [ссылка]