LINUX.ORG.RU

Избранные сообщения qub

Мастерская или человек, способный восстановить (напаять новый) MHF4-разъём на 4G-модеме

Форум — Linux-hardware

Приветствую.

В силу собственной криворукости я только что сорвал с платы 4G-модема EM7455 один из трёх коаксиальных антенных разъёмов MHF4. Дорожки и контактные площадки на самой плате не повреждены — я сорвал только внешний цилиндрический «ободок».

Не знает ли кто-нибудь мастерскую, сервисный центр или просто человека, способного/готового напаять на плату новый разъём?

Даже не знаю, что написать в теги и кого скастовать. ncrmnt?

 

intelfx
()

Посоветуйте софт для поиска дубликатов файлов под Linux

Форум — Desktop

Всех приветствую!

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

По типам файлов для поиска дубликатов важнее всего фото, видео, документы.

Есть что-то такое под Линукс?

Если не найду софт под Линукс, буду цеплять нарды и использовать софт под макось, но лучше бы Линукс, потому что есть ещё 3тб хард в btrfs, на котором часть данных также может дублироваться.

 , ,

ekzotech
()

Помощь в разборе задач

Форум — General

В связи с тем что я не могу создать сообщение в разделе инженерные и наука,создаю здесь и так есть задача из лабораторной 2 вариант 10(вот ссылка кому интересно https://www.dropbox.com/sh/k1ob0rcnqdzfowz/AACCsKLbtinLdbvhtNvFZM7ra?dl=0): Распознавание образов, описываемых произвольными законами распределения. Взять количество наблюдений 50-100.

1. Реализовать алгоритм распознавания двух классов, описываемых произвольным законом распределения с известными параметрами. 2. Провести имитационное моделирование алгоритма. Оценить вероятности ошибок 1-го и 2-го рода. 3. Рассчитать (оценить) теоретические вероятности ошибок и сравнить их с экспериментальными значениями.

1й класс Нормальное распределение mu=10 delta=3 2й класс Распределение Вейбулла mu=1.5 delta=3

И решение:

%task 2,variant 10: [2(1) +10(1)]
clc;
n = 100;
x1 = rand(n,2);
mu1 = 10;
sigma1 = 3;
x2 = rand(n,2);
mu2 = 1.5;
sigma2 = 3;
y1 = normpdf(x1(:,1),mu1,sigma1);
y2 = wblpdf(x2(:,1),mu2,sigma2);%weib

g1 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(y1) + (((y1 - mu1).^2)*(mu2^sigma2))./(2*(sigma1^2)*(y1.^sigma2))
g2 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(y2) + (((y2 - mu1).^2)*(mu2^sigma2))./(2*(sigma1^2)*(y2.^sigma2))
g = g1+g2
newmu1 =  log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(mean(y1)) + (((mean(y1) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(mean(y1)^sigma2));
newsigma1 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(std(y1)) + (((std(y1) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(std(y1)^sigma2));

newmu2 =  log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(mean(y2)) + (((mean(y2) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(mean(y2)^sigma2));
newsigma2 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(std(y2)) + (((std(y2) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(std(y2)^sigma2));

z1 = normpdf(g,newmu1,newsigma1);
z2 = wblpdf(g,newmu2,newsigma2);

l0 = n/2;
error12 = 0;
for i=1:l0
    error12 = error12 + z1(i);
end;
error21 = 0;
for i=l0:1
    error21 = error21 + z2(i);
end;
error12
error21

yt1 = normpdf(x1(:,2),mu1,sigma1);
yt2 = wblpdf(x2(:,2),mu2,sigma2);%weib

gt1 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(yt1) + (((yt1 - mu1).^2)*(mu2^sigma2))./(2*(sigma1^2)*(yt1.^sigma2));
gt2 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(yt2) + (((yt2 - mu1).^2)*(mu2^sigma2))./(2*(sigma1^2)*(yt2.^sigma2));

gt = gt1+gt2;
newmut1 =  log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(mean(yt1)) + (((mean(yt1) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(mean(yt1)^sigma2));
newsigmat1 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(std(yt1)) + (((std(yt1) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(std(yt1)^sigma2));

newmut2 =  log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(mean(yt2)) + (((mean(yt2) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(mean(yt2)^sigma2));
newsigmat2 = log((mu2^sigma2)/(sigma1/(2*pi)^(1/2))) - (sigma2^2 - sigma2)*log(std(yt2)) + (((std(yt2) - mu1)^2)*(mu2^sigma2))/(2*(sigma1^2)*(std(yt2)^sigma2));

zt1 = normpdf(gt,newmut1,newsigmat1);
zt2 = wblpdf(gt,newmut2,newsigmat2);

errort12 = 0;
for i=1:l0
    errort12 = errort12 + zt1(i);
end;
errort21 = 0;
for i=l0:1
    errort21 = errort21 + zt2(i);
end;
errort12
errort21


Правильно ли решение относительно всех вопросов?

 , , ,

Gremlin_
()

Почему нет госстандарта для асимметричного шифрования?

Форум — Security

Добрый день!

Вопрос отнюдь не праздный. Занимаюсь разработкой простого приложения для секьюрного обмена сообщениями по принципу PGP. Столкнулся с тем, что ГОСТами не предусмотрено алгоритмов асимметричного *шифрования* (не путать с электронной подписью по ГОСТ 34.10). Стало непонятно: почему? Мне казалось, что отечественные стандартны должны охватывать весь спектр криптографического функционала, тем более, в «пост-сноудоневскую» эпоху, а тут такой пробел.

Спасибо!

 , , , ,

Nikolaevich
()

Платку поиграться за до $100-150, выбор невелик совсем?

Форум — Linux-hardware

Я вижу ODROID-XU4 за $110 и BeagleBoard-X15 чуть дороже, первая с вентилем, а вторая вроде еще и не вышла в продажу.

Что купить поиграться? Будет как тонкий десктоп, сам линукс буду собирать на базе Void, там пакеты есть для ARMv6, ARMv7, еще будет тестовой управляющей платкой для cnc-станка.

Нужны нормальные cpu и gpu, памяти от 1 гига, идеально, чтобы был S/PDIF, но его в случае чего можно докупить поставить.

 , , , ,

slon
()

Почему гнутый линукс не готов не только для десктопа

Форум — Talks

Потому что его использование ничем не отличается от бега с препятствиями на минном поле с повязкой на глазах. Для примера возьмём утилиту wget из фонда GNU, которая есть практически во всех дистрибутивах Linux, и попробуем скачать файл с кириллицей в имени. В случае если сервер отдаст 302 Moved — можем получить файл с названием, которое отличается от ожидаемого. Идём читать ман:

‘--trust-server-names’

If this is set to on, on a redirect the last component of the redirection URL will be used as the local file name. By default it is used the last component in the original URL.


Вроде бы всё ясно. Качаем файл с опцией --trust-server-names и получаем нечитаемую кашу из кириллических букв, цифр и процентов в имени. Открываем опять ман:

--restrict-file-names=modes’


If you specify ‘nocontrol’, then the escaping of the control characters is also switched off. This option may make sense when you are downloading URLs whose names contain UTF-8 characters, on a system which can save and display filenames in UTF-8 (some possible byte values used in UTF-8 byte sequences fall in the range of values designated by Wget as “controls”).


Шёл 2015 год, а для нормальной работы с UTF-8 всё ещё нужно указывать какой-то ключ, подтверждающий что ты не Эдик. Но ведь теперь-то я могу быть уверен что с опциями --trust-server-names --restrict-file-names=nocontrol у меня во всех случаях файлы будут сохраняться с нормальными именами? Нет, т.к. даже осилив прочитать весь многостраничный ман у меня нет гарантий что поведение программы во всех случаях соответствует документации, не говоря уже об интуитивности и предсказуемости её поведения, а значит при беге риск нарваться на очередную скрытую мину времён второй мировой по-прежнему сохраняется.

 , , , ,

h578b1bde
()

Указатель на указатель на функцию

Форум — Development

Небольшой и, возможно, глупый вопрос по Си.

void f(void (**some_func)(void*)) {
    (*some_func)(some_func);
}
...
struct {
    void (*func_ptr)(void*);
    ...
} some_struct = { ... };
f((void (**)(void*))&some_struct);

Является ли приведённый выше код корректным?

По сути дела он базируется на двух предположениях:

1) Адрес первого поля структуры совпадает с адресом структуры. Пустые байты для выравнивания (если компилятор решил их добавить) всегда добавляются после поля, но не перед ним.

2) Указатель на указатель на функцию это самый обычный указатель на данные. Указатель на функцию сам по себе может быть особенным. Например, если речь идёт о гарвардской архитектуре, в которой код и данные имеют разные адресные пространства. Соответственно, указатель на функцию может быть чем-то принципиально иным, нежели указатель на данные (даже банально разрядности адресов в памяти программ и памяти данных могут быть разными). Но указатель на указатель на функцию это уже самое обычное число.

Верны ли эти предположения для всех архитектур, где имеет место быть Си?

 

KivApple
()

RPN калькулятор

Форум — Talks

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

Про MК-161 знаю, но он великоват. Есть еще какие-то DC, но они стоят сотни нефти.

 

dikiy
()

Как скрыть поля структуры в интерфейсе?

Форум — Development

ЯП: C99

Пытаюсь запилить shared library. Что имеется:

Файл lib.h (он же интерфейс):

typedef struct mystruct mystruct;

mystruct foo();

Файл lib.c (он же реализация):
#include "lib.h"

struct mystruct {
    float float_val;
    short short_val;
}

mystruct foo() {
    mystruct = {.float_val = 1.1};
    return mystruct;
}


Компилится нормально:
gcc -c lib.c -o lib.o -fPIC
gcc -shared -o lib.so lib.o


Проблема, естественно, состоит в том, что использовать хидер (он же интерфейс) практически невозможно, т.к. размера структуры мы не знаем, и, соответственно, юзер свою прогу с использованием либы скомпилить не сможет:
#include "lib.h"

int main() {
    // ...

    mystruct a = foo(); // вот тут плюнет "error: variable ‘a’ has initializer but incomplete type"
    // затем "invalid use of incomplete typedef ‘mystruct’"
    // а затем "storage size of ‘a’ isn’t known"

    // ...
    return 0;
}


Задача:
1) Юзер имеет только интерфейс. Использует только его и shared object.
2) Юзер не имеет доступа к полям структуры. Т.е. mystruct.float_val = 99.99; выполнить нельзя.

ЛОР, подскажи, пожалуйста.

Может внутрь хидера зашибенить какое-то говно типа
struct blablabla {
    char[sizeof(needed_structure)];
};
?

UPD: Решение - opaque pointer. Возвращать структуру а не указатель на неё - моветон. Если так и делать, то лучше открыть структуру вместо велосипедирования.

 ,

reprimand
()

Преобразование DOC в HTML на Delphi

Форум — Desktop

И желательно чтобы из DOCX тоже преобразование было; Нет руководства, в google был!

 

KRex
()

В Linux зафиксирована уязвимость CVE-2016-5195

Новости — Безопасность
Группа Безопасность

В ядре Linux обнаружена уязвимость, позволяющая повысить привилегии локального пользователя.

Причина уязвимости — race condition («состояние гонки») при обработке подсистемой управления памяти copy-on-write операций для частных маппингов памяти, доступной только для чтения. Непривилегированный пользователь может воспользоваться этим для повышения своих привилегий и получения возможности записи в память, размеченную только для чтения.

Патч, устраняющий уязвимость, просуществовавшую в ядре девять лет (начиная с Linux 2.6.22), уже представлен.

>>> Подробности

 , ,

mathcrosp
()

Сортировка пузырьком и делфи

Форум — Development

Почему эта сортировка не работает? Компилятор ошибок не выдает, приложение запускается, но при осуществлении сортировки, приложение крашится, и выскакивает ошибка в связи с вызовом класса исключений...

//MArr- заданный пользователем и собранный из случайных чисел 2 мерный динамический массив из int'ов
//i-строки
//j-столбцы
        i:=Low(MArr);
        Sort:=true;
      
        while Sort do
        begin

        sort:=false;

          Repeat

          begin
          for j:= Low(MArr[i]) to High(MArr[i]) do    
            begin

            // перебор каждой ячейки строки от 1 до последней
            if ( j<High(MArr[i]) ) then
              begin
              if ( MArr[i, j]>MArr[i, j+1] ) then
              begin
              Sort:=True;
              Tmp:=MArr[i, j];
              MArr[i, j]:=MArr[i, j+1];
              MArr[i, j+1]:=Tmp;
              end;
              end

            else if ( i<High(MArr) ) then
            begin
            if ( MArr[i, j]>MArr[i+1, 0] ) then
              begin
              Sort:=True;
              Tmp:=MArr[i+1, 0];
              MArr[i+1, 0]:=MArr[i, j];
              MArr[i, j]:=Tmp;
              end;
            end;
            end;

            Inc(i);
          end;
          until (i=High(MArr)+1);
        end; 

 ,

Rot1
()

Где купить Raspberry Pi 3?

Форум — Linux-hardware

Хочу к телевизору прицепить Raspberry Pi + OpenELEC + HDD + пульт ДУ от ТВ для просмотра мультимедиа (фото, видео до 1080p).

Собственно несколько вопросов:

1. Где принято покупать Raspberry Pi 3?

2. Пульт от телевизора можно будет прицепить к OpenELEC?

 , ,

Allakka
()

Аппаратный ускоритель сортировки и поиска.

Форум — Talks

Интересно, существуют ли аппаратные ускорители поиска и сортировки?

Например сортировка. Чип состоит из массива ячеек каждый из которых имеет размер 512 байт. параллельно с длинной ячейкой есть короткая содержащая исходный порядковый номер. Каждая ячейка соединёна с той 2 соседними n-1 и n+1. Когда на ячейки приходит сигнал сортировки. Ячейки обмениваются значениями, таким образом каждый такт значения «тонут» и «всплывают». Когда происходит такт при котором обмен не совершался, обмен считается завершённым. Можно считать значения напрямую или считать их исходные номера.

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

Неужели таких чипов ещё никто не делал?

 , ,

rezedent12
()

Антикомариная крайне жестокая геноцид-ситема

Форум — Talks

Я живу там, где жарко. Я живу там, где есть комары. Я страдаю.
Чтобы хоть в какой-то степени облегчить мои страдания я к старому стриммеру прицепил пару 12В кулеров.
В комнате темно. Есть лишь слабое дежурное освещение и свет монитора.
Эти жалкие свистящие кровопийцы летят к кулерам.
И их там, уродцев сраных, перемалывает лопастями!
Человеческий гений победил! Спасибо тебе, непроизносимый немецкий производитель стриммеров. Ты меня спас.

СОВЕТ: ПОСТАВЬТЕ РЯДОМ С ИСТОЧНИКОМ СВЕТА ВЕНТИЛЯТОР С ХОРОШЕЙ ТЯГОЙ. Комаров, ничтожеств, туда затягивает как в чёрную дыру. Ктулху свидетель!

P.S. Комары летят на тепло и запах пота. Если нет возможности их уничтожить, то помойтесь перед отбоем — будет легче.

 ,

Stahl
()

Распределить на равные группы

Форум — Development

Есть Set<List<String>> listSet. Листы в сете могут быть произвольной длинны. Нужно распределить листы на две группы, чтобы получилось почти одинаковое кол-во по list.size() в левой и правой группе.

Ткните носом в формулу, плз

 

by_zero
()

systemd и key-файл LUKS/dm-crypt на флешке

Форум — Security

Третьи сутки не могу заставить Debian Stretch (винт полностью зашифрован при установке, /boot вынесен на флешку) стартовать с использованием key-файла на запускной флешке. Многочисленные нагугленные инструкции относятся к до-systemd'шной эре, как его стартовать в новых условиях так и не нашел. Прошу подсказать по теме или дать ссылку где прочитать.

 ,

Neuro75
()

Работа с COM-портом через QSerialPort

Форум — Development

Qt: 5.6.1, GNU/Linux: Gentoo. Пишу программку по обмену данными с счётчиком Меркурий 200 по RS-485. Свисток USB->RS-485: Exar XR21B1411.

Пишу используя QSerialPort.

Проблема в следующем, программа не передаёт/принимает данные, при этом никаких сообщений об ошибках нет.

При этом на serial->open( QIODevice::ReadWrite ) на свисте загораться светодиод, а на serail->close(); гаснет.

Метод serial->write( byte, 7 ) возвращает 7 байт как записанных, а сигнал readyRead() вообще не вызывается.

Да, в винде всё работает, но мне надо бы в линуксе.

~ $ lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 011: ID 04e2:1411 Exar Corp. 
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 003 Device 002: ID 046d:c505 Logitech, Inc. Cordless Mouse+Keyboard Receiver
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Какое может быть решение?

 , ,

keeper_b
()

Помогите починить dsdt

Форум — Admin

Помогите собрать dsdt без ошибок. Сам уже замучился разбираться в этом asl, жутко странный язык, на русском ничего по нему не нашел, а по-английски не готов читать. Ошибки какие-то не типичные. Также не понятно, как asus собрал dsdt интеловским компилятором 2012 года, если у меня он выдает 5 ошибок (может декомпилируется с ошибками?).

aml: http://rgho.st/8ZqBGGyLn

asl: http://rgho.st/8jJbgdf9Y

Декомпиляция:

Intel ACPI Component Architecture
ASL+ Optimizing Compiler version 20160212-64
Copyright (c) 2000 - 2016 Intel Corporation

Input file dsdt.dat, Length 0x161BD (90557) bytes
ACPI: DSDT 0x0000000000000000 0161BD (v02 _ASUS_ Notebook 00000012 INTL 20120711)
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)

Parsing completed

Found 18 external control methods, reparsing with new information
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)

Parsing completed
Disassembly completed
ASL Output:    dsdt.dsl - 750692 bytes
Обратная компиляция:
Intel ACPI Component Architecture
ASL+ Optimizing Compiler version 20160212-64
Copyright (c) 2000 - 2016 Intel Corporation

Compiler aborting due to parser-detected syntax error(s)
dsdt.dsl   2399:                 Zero
Error    6126 -                    ^ syntax error, unexpected PARSEOP_ZERO

dsdt.dsl   2483:                         Zero
Error    6126 -                            ^ syntax error, unexpected PARSEOP_ZERO

dsdt.dsl  12338:         }
Error    6126 -         ^ syntax error, unexpected '}'

dsdt.dsl  21771:                 Local1 = (0x0A - Local0)
Error    6126 -                      ^ syntax error, unexpected PARSEOP_LOCAL1

dsdt.dsl  24058: 
Error    6126 - syntax error, unexpected $end and premature End-Of-File

ASL Input:     dsdt.dsl - 24058 lines, 750692 bytes, 11855 keywords
Hex Dump:      dsdt.hex - 203 bytes

Compilation complete. 5 Errors, 0 Warnings, 0 Remarks, 0 Optimizations
Ноутбук asus x555ld. Кто в этом разбирается гляньте пожалуйста.

 ,

Simarc
()

Запилил безрутовый Reverse Tethering для Android

Форум — Mobile

[update]

Новая версия: https://github.com/vvviperrr/SimpleRT

Реализована поддержка сразу нескольких подключенных android девайсов, притом все девайсы находятся в одной виртуальной сети. Удобно напрямую обмениваться файлами с девайса на девайс.

Днс сервер теперь можно указать вручную, либо оставить используемый по умолчанию.

Код полностью переработан, софтина стала намного стабильнее.

Потенциальные юз-кейсы (помимо очевидного - получения интернета):

  • анализ трафика
  • основа для стенда тестирования

[/update]

Позволяет раздать интернет с ПК на мобильный девайс через usb, без рута, без adb. Зачем оно местному анонимусу? В случаях, когда нет wi-fi, когда не ловит 3g/lte (или ловит, но скорость небольшая), но есть ПК с жирным каналом. Почему бы не воспользоваться им, да еще и попутно подзарядить девайс?

Софтина в 2-х частях, андроидная и десктопная. Андроиды поддерживаются от 4.0 и выше. Оси - только линукс и osx. По факту создается виртуальный туннель, на десктопе настраивается ip forward и nat. Можно использовать для передачи файлов с ПК на девайс и обратно (поднять туннель и запустить ftp/samba/etc сервер на девайсе). Хорошая альтернатива mtp (который под линуксом работает чуть лучше, чем никак).

Для передачи данных по usb используется Android Open Accessory API, т.е ПК выступает в роли аксессуара. Со стороны ПК - libusb, с простой реализацией AOA.

Андроидная часть - простой VpnService, без гуя. При первом коннекте девайс спросит, использовать ли софтину постоянно с этим «аксессуаром» и разрешает ли владелец перехват трафика. При последующих соединениях просто молча запустится тетеринг.

Есть минусы: некоторые приложения (например youtube) не хотят работать с сетью, если нет ни wi-fi, ни 3g соединения. Выход - смириться, либо перед запуском туннеля оставить один из видов соединения. Трафик все равно пойдет по туннелю (на нем дефолтный маршрут). Ну либо поднять рута, в xposed framework есть плагин, который исправляет ситуацию.

Конкуренты с маркета:

Естественно open source. Код далек от идеала, по факту это просто proof of concept. Но работает стабильно. Идеи, пожелания, рекомендации охотно принимаются на гитхабе.

Если нет желания самому собирать апкшку - на гитхабе лежит уже собранная. Если софтина вызовет хоть минимальный интерес у сообщества - так и быть, подарю гуглу 25 баксов и выложу в маркет.

https://github.com/vvviperrr/SimpleRT

пс. подгоните иконку тематическую.

upd. тема на hn - https://news.ycombinator.com/item?id=12198085

Перемещено Klymedy из development

 , , , ,

vvviperrr
()