LINUX.ORG.RU

Сообщения Stanson

 

Вебные аналого-цифровые индикаторы.

По итогам Есть ли что-то типа Grafana только на порядки легче и проще?

Написал ещё тогда и забыл. Ну пусть новогодний подарочек будет.

Продолжаем делать правильный вебдваноль. Как обычно, всё очень маленькое (2.5kb) и шустрое, на plain JS без каких-либо «фреймворков» и прочего многотонного жирного говна. Легко влезает в эмбедщину всякую и т.п.

Итак…

gauge.js

'use strict'

function Gauges( class_name )
{
    var _ = this;
    _.urls = [];
    var gauge = document.getElementsByClassName( class_name );
    for( var j = gauge.length; j--; )
    {
        var e = gauge.item(j);
        var g = JSON.parse( e.getAttribute( "data-conf" ) );
        if( !g ) return;

        g.id = e.id;
        g.title = e.title;
        e.removeAttribute( 'title' );

        var c = g.size / 2;
        var r = 0.8 * c;
        var l = 2 * Math.PI * r;

        for( var i = _.urls.length; i--; ) { if( _.urls[i].url == g.url ) break; }
        if( i < 0 ) _.urls.push( { url: g.url, gauges: [ g ] } );
        else        _.urls[i].gauges.push( g );

        e.innerHTML =
            '<svg width="' + g.size + '" height="' + g.size + '">'
          + '<circle class="gauge-bg" id="' + g.id + '-bg" cx="' + c + '" cy="' + c + '" r="' + r + '" stroke-dasharray="' + ( 2 * l / 3 ) + " " + ( l / 3 ) + '" stroke-dashoffset="' + ( -5 * l / 12 ) + '"/>'
          + '<circle class="gauge-pnt" id="' + g.id + '-pnt" cx="' + c + '" cy="' + c + '" r="' + r + '" stroke="' + g.color + '" stroke-width="' + ( 0.1 * g.size ) + '" stroke-dasharray="0 1"/>'
          + '<text class="gauge-val" id="' + g.id + '-val" fill="' + g.color + '" x="' + c + '" y="' + ( 1.1 * c ) + '" font-size="' + ( 0.45 * r ) + '" text-anchor="middle"></text>'
          + '<text class="gauge-title" x="' + c + '" y="' + ( c + r ) + '">' + g.title + '</text>'
          + '</svg>';
    }

    _.urls.forEach( function( u )
    {
        _.update( u );
        setInterval( function(){ _.update( u ) }, u.gauges[0].int );
    } );
}

Gauges.prototype.set = function( id, min, max, val )
{
    var e = document.getElementById( id + '-pnt' );
    if( !e ) return;

    var r = e.getAttribute( 'r' );
    var l = 2 * Math.PI * r;
    var v = val < min ? min : val > max ? max : val;
    var dash = ( 2 / 3 ) * l * ( v - min ) / ( max - min );

    e.setAttribute( 'stroke-dasharray', [ dash, l - dash ]);
    e.setAttribute( 'stroke-dashoffset', (-5 / 12) * l );

    document.getElementById( id + "-val" ).textContent = val;
}

Gauges.prototype.update = function( u )
{
    var _ = this;
    var req = new XMLHttpRequest();
    req.onreadystatechange = function()
    {
        if( this.readyState != 4 ) return;
        var obj = JSON.parse( this.responseText );
        if( !obj ) return;
        u.gauges.forEach( function( g )
        {
            var v = g.path.split('.').reduce( function( o, k ) { return o && o[k] }, obj );
            _.set( g.id, g.min, g.max, v.toFixed( g.prec ) );
        } );
    };
    req.open( "GET", u.url );
    req.send();
}

gauge.css

@font-face {
    font-family: "7SEG";
    src: url("DSEG7Classic-BoldItalic.ttf") format("opentype");
}

.gauge-pnt {
  fill: transparent;
}

.gauge-bg {
  stroke: #808080;
  stroke-width: 1px;
  fill: transparent;
}

.gauge-val {
    font-family: "7SEG", serif;
}

.gauge-title {
    text-anchor: middle;
    fill: #C0C0C0;
}

Шрифт DSEG7Classic-BoldItalic.ttf ради прикола, можно из дебиановского пакета fonts-dseg взять. Или в формате woff2, он размером поменьше будет.

Как использовать:

<HTML>
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" content="no-cache">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<LINK rel="stylesheet" type="text/css" href="gauge.css">
<SCRIPT src="gauge.js" type="text/javascript"></SCRIPT>
<SCRIPT>
var ups_gauges;
window.addEventListener( 'load', function() { ups_gauges = new Gauges( 'ups' ); }, false );
</SCRIPT>
<STYLE>
a.ups { outline: none; }
body { background-color: #000000; color: #c0c0c0; }
</STYLE>
<TITLE>Gauge</TITLE>
</HEAD>
<BODY>
<a href="ups/voltage.html" class="ups" title="UPS Vin, V"  id="Vin" data-conf='{"url":"data/ups.json","path":"Vin","int":20000,"min":0,"max":300,"prec":0,"color":"#40C040","size":150}'></a>
<a href="ups/load.html"    class="ups" title="UPS Load, %" id="Load" data-conf='{"url":"data/ups.json","path":"Load","int":20000,"min":0,"max":100,"prec":0,"color":"#C040C0","size":150}'></a>
<a href="ups/temp.html"    class="ups" title="UPS T, °C"   id="Temp" data-conf='{"url":"data/ups.json","path":"Temp","int":20000,"min":0,"max":100,"prec":1,"color":"#C0C0C0","size":150}'></a>
</BODY>

data/ups.json

{ "Vin": 193.2, "Load": 40, "Temp": 38.0 }

В аттрибут data-conf элемента который превращаем в индикатор пишем JSON где

url - URL источника данных для индикатора в формате JSON
path - "путь" в JSON до нужной величины, например "sensors.0.temp"
int - интервал обновления в миллисекундах
min - минимальное значение аналоговой шкалы индикатора
max - максимальное значение аналоговой шкалы индикатора
prec - число цифр после запятой для цифрового индикатора 
color - цвет индикатора
size - размер индикатора

У элементов превращаемых в индикаторы должен быть установлен аттрибут id.

В аттрибуте title указывается подпись под индикатором.

Элементам индикаторов одной группы присваеваем один класс и его имя передаём в конструктор new Gauges('class_name') когда нужно создать и запустить индикаторы.

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

Выглядит так: http://stanson.ch/gauges.png

Лицнзия WTFPL

 , ,

Stanson ()

Лицензия для тех, кто ненавидит GPL но не хочет чтобы корпорации тырили даром код

На каждую хитрую жопу …., как говорится.

https://plusnigger.autism.exposed/

Пример MIT+NIGGER лицензии:

Copyright [year] [name of author]

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice, this permission notice and the word "NIGGER" shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 , ,

Stanson ()

Есть ли что-то типа Grafana только на порядки легче и проще?

Есть что-нибудь для рисования графичков, индикаторов и всего такого на страничке в реалтайме, лёгкое и простое, на plain JS, без всяких сраных npm и без каких-либо зависимостей? Килобайт так на 10-20 не больше.

Или как и в случае с DASH player придётся всё самому с нуля делать, ибо вебмакаки принципиально неспособны создать что-либо маленькое, простое, быстро работающее и не сжирающее всю доступную память?

ЗЫ: Пожалуйста, не предлагайте ничего, что представляет из себя что-то отличное от одного скрипта на plain JS без каких-либо зависимостей типа jQuery и т.п.. Тем более не предлагайте что-либо с package.json в репозитории. И не предлагайте что-то, что в неминифицированном виде весит больше 10-20кб.

ЗЗЫ: Мда.. Судя по ужасу который мне тут предложили, похоже придётся самому писать.

 , , , ,

Stanson ()

А что нынче принято использовать в качестве аддона BugMeNot?

А то кроме сайтика от BugMeNot ничего не осталось, а все эти «register for free to view article» ингода задалбывают даже при наличии собственного почтового сервера.

Да и сам BugMeNot окончательно скурвился, блокируя добавление логинов-паролей для всякого говнища типа твиттеров-пейсбуков и т.п.

Основная задача - возможность просматривать аттачи на форумах без регистрации, на самом деле.

 

Stanson ()

Ищется софтина пригодная для отображения движущихся объектов на карте.

Есть ли какая-нибудь маленькая и простая софтинка которая позволяет показывать карту (например утащенную с OSM и сохранённую локально) и накладывать на неё движущиеся объекты, скармливая ей в реалтайме координаты?

Нужно для отображения на карте летающих вокруг самолётов текущие координаты и пр. инфа о которых вылавливаются из эфира с их транспондеров в формате ADS-B и Mode S/3A/3C. Что-то типа украшения на стену хочу.

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

Теоретически можно и вебню какую-нибудь, на тыщу строк жабоскрипта, если это не многотонное убожище с вуями, реактами и прочими ненужно.

Понятно, что написать несложно, но вдруг уже есть?

ЗЫ: монстров типа QGIS или GRASS не предлагать.

 , ,

Stanson ()

Снова что-то «улучшили» в социальщине и всяких ОС с зондами?

С недавнего времени mp4 видосики в вацапе превратились из обычного mp4 в нечто без заголовка и пр. Ни один нормальный плеер, включая ffmpeg и gst их не понимает. В ведроиде воспроизводятся. Подозреваю, что это произошло после последнего обновления вацапа.

$ ffprobe test.mp4 
ffprobe version 4.4 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10.3.0 (GCC)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --docdir=/usr/doc/ffmpeg-4.4/html --mandir=/usr/man --disable-debug --enable-shared --disable-static --enable-gpl --enable-version3 --enable-avresample --arch=x86_64 --disable-encoder=aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gnutls --enable-libbluray --enable-libcaca --enable-libcdio --enable-frei0r --enable-openal --enable-libopus --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libmp3lame --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libpulse --enable-libsmbclient --enable-libxml2 --enable-librsvg --enable-libdrm
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x23e8340] Format mov,mp4,m4a,3gp,3g2,mj2 detected only with low score of 1, misdetection possible!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x23e8340] moov atom not found
test.mp4: Invalid data found when processing input

Оно теперь пожато, зашифровано или ещё что? На вид - структуры там никакой, ни заголовков, ничего, просто случайные байты.

Пример файла - http://www.stanson.ch/test.mp4

Там видео потопа в Германии со старым мерсом в идеальном состоянии должно быть.

Это вообще что, и почему нигде ничего про это долбаное «новшество» не слышно?

ЗЫ: Похоже нашёл: https://github.com/sh4dowb/whatsapp-media-decrypt

Дебилизм какой-то. Просто на пустом месте лишний геморрой.

ЗЗЫ: Насколько я понял, воспроизведение всех видосиков любыми софтинами использующими системную либу теперь перхвачено какой-то вацапной хренью, которая смотрит, не зашифрованный ли это вацапный файл, и если да, то на лету расшифровывает и отдаёт низлежащей либе, а обычные файлы транслирует без изменений. Поэтому вацапные файлы воспроизводятся всякими штатными галереями и пр. Т.е. теперь вацап имеет прямой доступ ко всем видосикам которые вы смотрите на своём телефоне. Ничуть не удивлюсь, если окажется что «неправильный» видосик даже из какого-нибудь телеграмчика или там вообще залитый по USB вы теперь посмотреть не сможете.

 , , , ,

Stanson ()

Немонстроузный web-проигрыватель бесконечного DASH потока с IP камеры.

Все говнобраузеры до сих пор не умеют в RTSP и даже не умеют нормально проигрывать бесконечный поток. Какое-то позорище натуральное. Бесконечный поток с камеры, например, поставленный на паузу вообще ни разу не должен продолжаться с той самой секунды когда его остановили. Внезапно. А должен продолжаться при снятии с паузы с самого последнего принятого keyframe. И браузеру нахер не нужно сжирать всю память пытаясь сохранить всё, что было передано с момента нажатия на паузу. Но, видимо, для браузерописцев эти элементарные вещи совершенно недоступны для понимания, и в результате реализация HTMLVideoElement’а, что в хроме, что в фаерфоксе является полным говном.

Для проигрывания таких потоков вебмакаки используют монстроузные жирнющие жабоскриптные плееры, которые фактически с ложечки кормят HTMLVideoElement загружаемыми кусочками видео, обычно DASH или HLS.

Оказалось что самый маленький плеер умеющий проигрывать multiple-file-DASH видео (openplayer.js) весит 167 килобайт, сцуко! И это минифицированный вариант! Чему там можно столько весить я нихрена не понял. Про «референсный» dash.js я вообще молчу. Это лютейший звездец размером больше полмегабайта в минифицированном виде. Мелкософтовский пример жабоскриптного DASH-плеера заточен на single-file-DASH. А ffmpeg c -single_file 1 пишет поток на диск бесконечно, засирая диск далеко не всегда нужным видеомусором.

Разумеется, как всегда, когда дело касается вебни, чтобы решить элементарную проблему, вместо того, чтобы взять какой-нибудь эталонный микроскопический плеер, пришлось быстренько изобрести велосипед. Разумеется, всё легко влезло в смешные 5 килобайт, причём в неминифицированном виде.

Вот велосипед:

Жабоскрипт:

'use strict'

function Dash( id )
{
    var _ = this;
    _.v = document.getElementById( id );
    var url = _.v.src;
    _.v.src = undefined;
    var slash = url.lastIndexOf("/");
    _.path = url.substring( 0, slash + 1 );
    _.mpd = url.substring( slash + 1 );
    _.init = true;
    _.xhr = [];
    _.load_mpd( false );
    _.video_update  = function() { _._video_update(); };
    _.video_updated = function() { _._video_updated(); };
    _.video_updating = false;

    _.v.addEventListener( 'click', _.toggle.bind(_), false );

    _.v.addEventListener( 'pause', function ()
    {
        console.log( 'paused' );
        this.removeEventListener( 'timeupdate', _.video_update );
        if( _.videoSource.updating ) _.videoSource.abort();
        _.xhr.forEach( function ( xhr ) { xhr.abort(); } );
    }, false);

    _.v.addEventListener( 'play', function()
    {
        console.log( 'playing' ); 
        this.addEventListener( 'timeupdate', _.video_update, false );
    }, false);

    _.v.addEventListener( 'ended', function()
    {
        console.log( 'ended' );
        this.removeEventListener( 'timeupdate', _.video_update );
    }, false);

    _.v.addEventListener( 'error', function(e) { console.log( 'video error: ' + e ); }, false );
    _.v.addEventListener( 'emptied', function() { console.log( 'emptied' ); }, false );
}

Dash.prototype.play = function() { this.load_mpd( true ); }
Dash.prototype.stop = function() { this.v.pause(); }
Dash.prototype.toggle = function()
{
    if( this.v.paused == true ) this.play();
    else                        this.stop();
}

Dash.prototype.mpd_parse = function( data )
{
    var _ = this, e, g;
    e = data.querySelectorAll("Representation")[0];
    g = e.getAttribute.bind( e );
    _.id        = g( 'id' );
    _.mimetype  = g( 'mimeType' );
    _.codecs    = g( 'codecs' );
    _.width     = g( 'width' );
    _.height    = g( 'height' );

    e = data.querySelectorAll( 'SegmentTemplate' )[0];
    g = e.getAttribute.bind( e );
    _.timescale = g( 'timescale' );
    _.ini       = g( 'initialization' );
    _.seg       = g( 'media' );
    _.start     = g( 'startNumber' );

    _.ini = _.ini.replace( '$RepresentationID$', _.id );
    _.seg = _.seg.replace( '$RepresentationID$', _.id );

    _.duration = [];

    data.querySelectorAll("S").forEach( function( v, i )
    {
        _.duration[i] = v.getAttribute( 'd' ) / _.timescale;
        if( i == 0 ) _.ts = v.getAttribute( 't' );
    } );
}

Dash.prototype.load_mpd = function( start )
{
    var _ = this;
    _.xhr[0] = new XMLHttpRequest();
    _.xhr[0].onreadystatechange = function ()
    {
        if( this.readyState != this.DONE ) return;
        if( this.status != 200 ) return;

        var parser = new DOMParser();
        var xmlData = parser.parseFromString( this.response, 'text/xml' );

        _.mpd_parse( xmlData );

        if( start )
        {
            _.video_updating = false;
            _.num = parseInt( _.start ) + 1;
            _.ts_current = _.v.currentTime;
            _.load_seg();
        }

        if( _.init )
        {
            _.v.width  = _.width;
            _.v.height = _.height;
            _.mediaSource = new window.MediaSource();
            _.mediaSource.addEventListener( 'sourceopen', function (e) {
                _.videoSource = _.mediaSource.addSourceBuffer( _.mimetype + '; codecs="' + _.codecs + '"' );
                _.videoSource.mode = 'sequence';
                _.videoSource.addEventListener( 'updateend', _.video_updated, false );
                _.load_ini();
            }, false );
            _.v.src = URL.createObjectURL( _.mediaSource );
        }
    }
    _.xhr[0].open( 'GET', _.path + _.mpd );
    _.xhr[0].send();
}

Dash.prototype.append = function( f )
{
    var _ = this;
    _.xhr[1] = new XMLHttpRequest();
    _.xhr[1].responseType = 'arraybuffer';
    _.xhr[1].onreadystatechange = function ()
    {
        if( this.readyState != this.DONE ) return;
        if( this.status != 200 ) return;
        _.videoSource.appendBuffer( new Uint8Array( this.response ) );
    };
    _.xhr[1].open( 'GET', _.path + f );
    _.xhr[1].send();
}

Dash.prototype.load_ini = function()
{
    this.append( this.ini );
}

Dash.prototype.load_seg = function()
{
    var n = this.num.toString();
    if( n.length < 5 ) n = ( '0000' + n ).slice( -5 );
    this.append( this.seg.replace( '$Number%05d$', n ) );
}

Dash.prototype._video_update = function()
{
    var _ = this;
    if( _.video_updating ) return;
    var i = _.num - _.start;
    if( _.v.currentTime >= _.ts_current - _.duration[i] * 0.5 )
    {
        _.video_updating = true;
        _.load_seg();
    }
}

Dash.prototype._video_updated = function()
{
    var _ = this;

    if( _.init ) { _.init = false; return; }

    if( _.v.paused == true )
    {
        _.v.currentTime = _.ts_current;
        _.v.play();
    }
    _.ts_current += _.duration[ _.num - _.start ];
    _.num++;
    if( _.num - _.start >= _.duration.length - 1 ) _.load_mpd( false );
    _.video_updating = false;
}

Страничка:

<HTML>
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" content="no-cache">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<SCRIPT src="tiny-dash.js" type="text/javascript"></SCRIPT>
<SCRIPT>
var dash;
window.addEventListener( 'load', function() { dash = new Dash( 'dashvideo' ); }, false );
</SCRIPT>
<TITLE>Camera stream</TITLE>
</HEAD>
<BODY bgcolor="#000000" text="#c0c0c0">
<VIDEO id="dashvideo" src="media/manifest.mpd" preload="none">No video available</video>
</DIV>
</BODY>

На серваке из-под nobody запустить

#!/bin/sh

stream="rtsp://host:port/ch0_264"
target="/где.там.страничка.лежит/media/manifest.mpd"

/usr/bin/ffmpeg \
-probesize 32 \
-loglevel quiet \
-i "${stream}" \
-an \
-c:v copy \
-f dash \
-window_size 4 \
-extra_window_size 1 \
-min_seg_duration 2000000 \
-remove_at_exit 1 \
"${target}"

В /где.там.страничка.лежит/media лучше примонтировать tmpfs - и шустро, и диск не трогает.

Длительность сегмента и размер окна можно подкрутить, если канал убогий.

Для руления плеером из жабоскрипта есть методы Dash.play(), Dash.pause() и Dash.toggle(). Всякие кнопки и украшательства добавляются по вкусу.

Работает в хроме и фаерфоксе. Задержка, разумеется есть, но без неё, увы, при воспроизведении DASH не обойтись.

Решение отлично подходит для камер, которые нафиг не нужно куда-то записывать, но которые хотят смотреть много (и даже очень много) людей одновременно. HTTP сервер всего лишь раздаёт не особо большие файлики из tmpfs, так что нагрузка минимальна.

В принципе, это всё несложно использовать для организации self-hosted zoom при минимальной доработке - нужно только организовать передачу потоков с вебок на сервер (да хоть через netcat), а там их так же раскладывать в сегменты ffmpeg’ом.

Лицензия - WTFPL

ЗЫ: Хотел в теги добавить ещё «копрофилию» но ограничение на 5 тегов испортило всю малину.

ЗЗЫ: Это, кстати, эксклюзив специально для ЛОР. :) Нигде больше публиковать это я не собираюсь.

 , , , ,

Stanson ()

Обсуждение виндовых костылей - оффтопик или нет?

Господа и дамы модераторы. Я вообще крайне редко сюда пишу (возможно это вообще первый раз), но почему до сих пор не удалено вот это - PowerShell на работе и в быту за оффтопик?

Собственно прошу не удалить и т.п. (я никогда не стучу на пассажиров), а разъяснить - что-то изменилось и теперь на ЛОРе разрешено обсуждение вендософта, да ещё и вне Talks?

Отмазка про «ну поверщель работает на линуксе» не принимается. Я могу создать 100500 аналогичных тем с аналогичным тупняком типа «как в regedit заменить все значения ключей по маске» аргументируя тем, что regedit прекрасно работает в линуксе, причём как wine’овый, так и родной вендовый и его даже можно использовать для редактирования INI-style файлов типа юнитов системды.

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

В общем, желаю знать и всё такое.

Перемещено Shaman007 из linux-org-ru

 

Stanson ()

Широкополосный лямбда-зонд, зависимость напряжения от содержания О2

Специалистам по всему:

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

Полчаса гуглил - вообще по нулям, одни узенькие графички напряжения от лямбды в диапазоне максимум 0.5 - 2.5

Под рукой просто широкополосной лямбды что-то не нашлось, только обычные, так сам бы померил.

ЗЫ: Для неумеющих читать: Вопрос вообще никакого отношения к автомобилям не имеет, тем более не имеет отношения к сраному россиянскому «тюнинху». Если бы я занимался этой хернёй, то никаких вопросов не задавал бы - там всё совершенно элементарно и спрашивать просто не о чем и незачем. Если я и буду заниматься реальным тюнингом какого-нибудь из своих автомобилей, то вопросы будут про ГТД, jet-ECU, тахометр на 70тыс оборотов и т.п.

Вопрос про использование широкополосной лямбды в качестве практически дармового датчика содержания кислорода в газовой смеси. На алике датчики кислорода по 2500, а б/у широкополосных лямбд можно пучок за 3 копейки взять. И да, с «опорным» кислородом для широкополосной лямбды проблем нету, хоть 99% можно устроить.

 , ,

Stanson ()

QtWebEngine - насколько ungoogled?

QtWebEngine использует движок Chromium. Chromium в оригинальном виде насыщен гуглозондами, которые пытается выпилить проект Ungoogled Chromium. Насколько googled QtWebEngine?

Я тут просто потыкал последний Falkon, который является обёрткой для QtWebEngine, в принципе, оно вполне уже юзабельно. Ещё и адблок искаропки. Если QtWebEngine совсем ungoogled, то Флакон этот вполне себе может стать весьма годной альтернативой напичканному зондами Хрому с катящимся в полное дерьмо Фаерфоксом.

ЗЫ: Оказалось что в QtWebEngine (по крайней мере с 5.15) есть один неустранимый косячище - невозможно запретить ублюдочные и абсолютно ненужные web workers. Говорят в предыдущих версиях это было реально при помощи некоторых танцев с бубном и QTWEBENGINE_CHROMIUM_FLAGS=--disable-shared-workers, но теперь это больше не работает и после некоторого времени chrome://serviceworker-internals/ оказывается до краёв забит жрущим память и процессор говном со всяких говносайтов от яндекса до алиэкспресса, которые к сожалению приходится иногда посещать. Т.к. по URL не угадаешь, насуют ли тебе вебворкеров или нет, область применения falkon получается крайне ограниченной, и в этой области даже NetSurf рулит гораздо больше.

 , , ,

Stanson ()

Маководам и около вопрос

Насколько вменяемо работает Wine под macOS? Что-то чуть сложнее Notepad будет работать?

Вкратце - есть коммерческая софтина под венду, никаких извращений в коде, много матана, тупой Win32 API + чуть-чуть OpenGL (необязательно, это просто один из многих способов отображения трёхмерных цветовых пространств и образцов в нём), с приборами в основном общается через libusb-win32 (только bulk, если чо) и под линуксовым wine работает без малейших проблем.

Ввиду специфики иногда попадаются клиенты, все из себя такие дизайнеры, которым вынь да положь гейось. Очень не хочется связываться со всякими XCode и пр., да и вообще с разработкой под Apple. Насколько я нарыл инфы в гуглях, libusb под макосью вполне работает, wine вроде как тоже, через XQuartz, но никто не пишет насколько это всё стабильно и безглючно.

ЗЫ: чтобы wine работал с нативным usb у меня есть https://github.com/stanson-ch/libusb-wine , так что это не проблема, запилю туда же и под Darwin, там несложно.

 , ,

Stanson ()

Aliexpress окончательно угробили?

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

Есть варианты получить алиэкспресс всегда и только на английском? На т.н. «русском» им пользоваться абсолютно невозможно. Английский-то хоть как-то что-то можно было понять, но что он сделали сейчас - это полный звездец.

banggood.com тоже такой хернёй страдает, или там нет долбаной принудительной локализации?

Linux при том, что на алике всякие SBC и пр. умеющие в линукс продаются.

ЗЫ: Через ebay китайскую мелочёвку покупать проблематично, там китайцы отказываются с трекингом слать, и идёт оно гораздо дольше чем с алика.

ЗЗЫ: Через VPN и прокси ясен пень работает, вопрос про алик без VPN, проксей и прочего.

ЗЗЗЫ: Что интересно, через, например, голландский VPN оно почему-то принудительно нифига не включает Dutch и позволяет просто менять язык в выпадалке где страна, язык и валюта, и потом не самовольничает. А с тех IP, которые китайцы считают российскими, язык сменить вообще невозможно.

ЗЗЗЗЫ: Подсети, которые достаточно завернуть в VPN - 198.11.128.0/18 и 95.100.164.0/23. По крайней мере сегодня.

 , ,

Stanson ()

Как ни крути, а глобальное потепление - рулез.

На просторах интеренета попалось некоторое количество интересных вещиц:

Простая и наглядная, сугубо научная иллюстрация - https://climate.nasa.gov/climate_resources/3/graphic-warmer-earth-greener-north/

Канадцы тайно радуются глобальному потеплению: https://www.businessinsider.com/why-canada-secretly-loves-climate-change-2017-5

Холод убивает в 20 раз больше людей чем жара: https://www.sciencedaily.com/releases/2015/05/150520193831.htm

и т.п.

TL;DR: При дальнейшем ковырянии в гугле выяснилось, что глобальное потепление, вызванное парниковым эффектом, если таковое вообще происходит, это, на самом деле вовсе не проблема, а решение. Решение большинства проблем человечества и природы в чистом виде.

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

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

Суммируя парниковый эффект и глобальное потепление им вызванное, получаем примерно следующее: Сейчас среднегодовая температура воздуха в Москве примерно +5 градусов, а сезонный размах колебаний температуры от -20 до +30. Эколожцы стращают, что если среднегодовая температура поднимется на 10 градусов, то все сразу сдохнут летом от жары в +40, гроб, гроб, кладбище. И вот тут-то надо эколожцам по ручонкам-то настучать. Ведь это может случится только в том случае, если орбита Земли станет ближе к Солнцу при сохранении текущего климата, что определённо не наш случай. Нас-то пугают парниковым эффектом. А в случае роста среднегодовой температуры из-за парникового эффекта всё будет совершенно иначе (см. про эоцен ниже) - количество энергии от Солнца не изменится, а средняя температура планеты возрастёт из-за уменьшения градиента температуры от экватора к полюсам. Кроме того, уменьшатся сезонные, и суточные колебания. В итоге получим, например, вместо колебаний -20 - +30 и средней +5, среднюю +15 и размах +5 - +25. Т.е. летом может стать даже немного прохладнее, а вот долбаной зимы уже не будет.

Тропики: «Всё сгорит, будут раскалённые пустыни.» Нет. Для тропиков вообще мало что изменится. Прямо сейчас суточные колебания температуры в тропиках около 10 градусов, а сезонные и того меньше. Потому что в тропиках парниковый эффект уже присутствует по полной программе, просто он локальный. Там где парникового эффекта в этих широтах нету, расположены, внезапно, пустыни, с суточными колебаниями темпартур аж в 50 градусов. Так что если парниковый эффект станет глобальным, то для тропиков почти ничего не изменится. А вот пустыни превратятся в тропики.

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

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

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

Для нашей страны глобальное потепление тоже сулит огромные выгоды.

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

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

В общем, Грета стала выглядеть ещё мерзее.

ЗЫ: Эколожествующей школоте и хипстоте с горящими пердаками, притворно требующей научного пруфца в бессилии что-либо возразить:

https://advances.sciencemag.org/content/5/9/eaax1874

https://www.pnas.org/content/pnas/115/6/1174.full.pdf

https://www.pnas.org/content/pnas/102/42/14964.full.pdf Тут приведены не только среднегодовые темпаратуры эоцена для Европы, но и средние температуры самого холодного и самого жаркого месяца. Можно легко убедиться, что парниковый эффект приводит к резкому снижению сезонных колебаний температуры.

https://es.ucsc.edu/~jzachos/pubs/Tierney_etal_2017_NatGeosci.pdf

Насчёт «затопления». Площадь территории Антарктиды находящейся над уровнем моря в эоцене была на 25% больше нынешней.

https://www.sciencedirect.com/science/article/pii/S0031018219304845

+ ещё масса научных исследований климата эоцена элементарно находящихся в гуглях по запросу «eocene climate». Пруфцов того, что климат станет только лучше от глобального потепления вызванного парниковым эффектом - хоть жопом ешь. Было бы желание с ними ознакомиться.

 , ,

Stanson ()

SATA device MCU

Гугль-фу не помогает найти ни одного даташита на хоть какую-нибудь микруху c SATA PHY используемую в качестве SATA device.

Контроллеры HDD это вообще что-то жутко секретное. Ну может кроме Marvell 88i6745, который немножко поковыряли известные в узких кругах персонажи типа Dejan’а, да и то даже pinout оного в свободном доступе начисто отсутствует.

Контроллеры CD/DVD тоже покрыты мраком. Только какие-то унылые ошмётки маркетоидных листовок.

C SSD контроллерами дела тоже не лучше.

Сосбственно вопрос - встречал ли кто-ниубдь в живой природе даташит на хоть какой-нибудь MCU у которого есть SATA PHY и который предназначен для использования в качестве SATA device?

Самое интересное, что доки на SATA интерфейс в общем-то открыты, есть даже opensource IP для FPGA реализующие SATA PHY. И ведь уже хренова туча лет прошла с момента появления первых SATA девайсов. А вот документацию ни на один мелкопроцессор c SATA device periferal найти не могу.

ЗЫ: Использовать SATA->IDE переходник и вешать обычный MCU на IDE не предлагать. Так неинтересно. :)

 , ,

Stanson ()

Б/У моноблока выбора тред

После многих лет нещадной эксплуататции издох кухонный 19" мегапланшет (eMachines EZ1711 если чо) чинить, если честно, лень, оно того не стоит, там Atom D525 вместо процессора, спасала только дискретная невидия.

Нужно какую-то аналогичную хрень вместо него повесить.

  • Задачи - интернетик с ютубчиком и прочим вебдванолем, кинцо с локалки, ну и всё такое.
  • Размер - максимум 20", лучше 17"-18"
  • Рюшечки - желателен тачскрин, но можно и без него. Крепление стнадарта VESA очень приветствуется.
  • Цена - до ~10 тыр. Б/У разумеется.
  • Работа 24х7 в условиях кухни не должна приводить к проблемам.
  • Бренд и дата выпуска не особо волнуют - лишь бы не разваливался под своим весом, будучи прикреплённым за заднюю крышку. Сгодится даже честный китаец, если подходит под условия.

Из интересного для этих входных данных находятся только HP Pro 3420 с i3. Lenovo сплошь какой-то шлак на целеронах, атомах и днищенских AMD.

Есть забавный вариант - 17" iMac конца 2006 c Core2 Duo T7200, тыщ по 6 рублей. Взять чисто чтобы глумится над забредающими в гости маководами - насверлить дырок под VESA, снести убогую макось, воткнуть 4Gb RAM и накатить, разумеется Слаку. В принципе, по железу оно мало чем от Thinkpad T61 отличается, который используется как гостевой ноутбук и вполне устраивает по скорости для описанных задач, так что и этот iMac тоже устроит.

А больше ничего сколь-нибудь интересного вообще не попадается.

Теоретически, наверно можно и тыщ 15 потратить, если это будет что-то типа Thinkpad T430/T440/T450 в смысле мощности (минимум i5, 16Gb RAM и всё такое), неубиваемости и дубовости, только в виде 17-19" моноблока с тачскрином.

Подкиньте ещё годных вариантов, может есть какой-нибудь Thinkpad Txxx среди моноблоков, заодно просветите насчёт iMac вышеупомянутого - его радеон подцепится всякими vaapi или надо будет шаманить?

 , , , ,

Stanson ()

Невменяемое время инициализации у серверов HP

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

Например, HP DL360e Gen8 инициализируется аж 3 минуты. Gen9 - до 5 минут. И насколько я понимаю - это вообще никак не лечится.

А что с временем у аналогичной техники IBM например? Тоже жопа полная? IBM x3550 добирается до загрузки меньше чем за минуту. Модельки постарше - уже медленнее. А текущие модели как?

Понятно, что hard reset сервера - дело крайне редкое и в общем-то это скорее эстетическая хотелка, но блин по 5 минут ждать пока эти сраные USB, iLO, SATA controller и Smart Array проинициализируются? Это типа модно так сейчас делать, или это сделано чтобы выглядело поэнтерпрайзнее?

В общем, есть чо серверное, чтобы грузилось не дольше какого-нибудь ThinkPad T440?

ЗЫ: Долбаный энтерпрайз.

 , , ,

Stanson ()

Intel'овские плюшки для слаки

Вот, сваял слакбилд для slackware-current.

https://github.com/stanson-ch/beignet.SlackBuild

Теперь Beignet (Интелевский OpenCL для процессоров Gen3+ c Intel HD Graphics) собирается и работает на current'е.

В гимпе фильтры значительно шустрее работают и всё такоэ.

Beignet был заброшен Интелем в пользу compute-runtime, но последний поддерживает процессоры только начиная с Broadwell. А постоянно меняющийся llvm привёл к тому, что ванильный Beignet не собирается при мало-мальски свежем окружении. В общем, несколько патчей из дебиана, парочка из арча, немножко своего - и всё снова заработало.

Обновил для llvm11. Вроде работает. Задрали уже обратную совместимость ломать.

 , , , ,

Stanson ()

Однокристалки на RISC-V теперь и по $1.27

Наигравшись с клонированием STM32 GigaDevice выпустила линейку однокристалок GD32V с ядром RISC-V

Для Ъ:

  • Core – GD32VF103 RISC-V “Bumblebee Core” @ 108 MHz
  • Memory – 8KB to 32KB SRAM
  • Storage – 16KB to 128KB flash
  • Peripherals – USB OTG and CAN 2.0B
  • I/O – 3.3V, 5V tolerant
  • Supply Voltage – 2.6 to 3.6V
  • Package – QFN36, LQFP48, LQFP64, and LQFP100 packages

Годная замена STM32F103 за вменяемую цену.

Официальная девборда - $11
GD32VF103TBU6 MCU (QFN36, 64 kB Flash) по $1.27 поштучно, $0.95 в заказе >3000шт.
Официальная цена аналогичного STM32F103T8U6 (QFN36, 64kB Flash) - $2.0561 в партии 10000шт, если чо.

Скоро наверно и на алиэкспрессе какой-нибудь вариант девборды в виде BluePill появится.

Подробнее тут: https://hackaday.com/2019/08/27/gigadevice-releasing-risc-v-mcus-and-developm...

Английский datasheet: http://dl.sipeed.com/LONGAN/Nano/DOC/GD32VF103_Datasheet_Rev1.0.pdf

Английский manual: http://dl.sipeed.com/LONGAN/Nano/DOC/GD32VF103_User_Manual_EN_V1.0.pdf

И да, судя по даташиту оно pin-to-pin compatible с STM32F103

UPD: весь тулчейн и всё такое (openocd, newlib, доки ...) они таки выложили на https://github.com/riscv-mcu

UPD2: Хо-хо, а вот и библиотечка с примерами подъехала https://github.com/riscv-mcu/GD32VF103_Firmware_Library

UPD3: Охренеть, они ещё и libopencm3 запилили - https://github.com/riscv-mcu/libopenmcu

 

Stanson ()

Расставить все точки над i

Может всё-же я дождусь какого-либо официального ответа на предмет списка запрещённых на ЛОРе мировоззрений, обладатели которых будут забанены или ограничены в правах?

Почему такой простой вопрос так старательно обходится модераторским составом? Ведь в правилах есть список того, что на ЛОР запрещено, что мешает добавить туда же пунктик о запрещённых/подлежащих ограничениям мировоззрениях и политических, сексуальных, культурных и прочих пристрастиях?

Всякие гуманитарные жоповерчения типа : Какое вам дело до того, что пишут в никах другие? (комментарий) вообще-то недостойны технического форума, ибо неконкретны, некорректны и совершенно нелогичны.

Когда персонаж ставит себе в ник число, случайно совпадающее с неонацистским лозунгом, его аватарка случайно ссылается на вещество, молекула которого имеет форму свастики

Вот объясните мне, в чём проблема? Ну нравятся пассажиру неонацистские лозунги и свастика, что с того? В правилах на это никаких ограничений нету, там не написано, что неонацистам нельзя на ЛОР.

А если бы у пассажира был ник с каким-нибудь 69 и радуга на аватарке (или там какие-нибудь иезуитские/коммунистические/ЛММшные/whatever циферки и символы) - его бы так же обвинили в наличии неких взглядов или шланговании и на этом основании забанили? Очевидно нет.

Следовательно, причина бана заключается исключительно и только в том, что наличие определённых взглядов запрещено на ЛОР.

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

Де-факто, есть набор определённых взглядов/предпочтений, носителям которых (или тем, кто косит под таких носителей с целью троллинга) на ЛОР не рады.

Собственно непонятно, что мешает из де-факто сделать де-юре и раз и навсегда сделать забанивание носителей запрещённых взглядов (или троллей под них косящих) простым и рутинным процессом, а не драмой с многодневными флеймами и срачами?

Неонацист/мормон/любитель_свинины/вегетарианец ? Всё, забанен по пункту 14.88 правил.

В общем, огласите весь список, пожалуйста.

 

Stanson ()

Вопрос для математиков про 2D деформации.

Есть некая «правильная» сетка ограниченного размера из двумерных точек с координатами x1,у1 равномерно рапределённых в некоем прямоугольнике.

И есть «неправильная», «деформированная», «искажённая» сетка с теми же самыми точками, но с координатами x2,y2.

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

Эта деформация постоянна и не изменяется. Задача состит в том, чтобы имея эти 2 набора данных найти некую функцию (набор функций) которая позволит из произвольных «искажённых» координат x2,y2 в этом прямоугольнике получать «правильные» координаты x1,y1. Т.е. надо найти математическое выражение этой деформации.

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

Собственно вопрос в том, как эта задача в общем виде называется у математиков. Желательно по-английски. Всякое deconvolution как-то выносит в основном на что-то типа этого http://www.vassg.hu/pdf/vass_gg_2003_lo.pdf заточенное на заведомо известную модель искажений. Если модель заранее известна, то решение и так понятно как найти. А вот совсем общее решение, аналогичное какой-нибудь 1D/2D polynomial regression для произвольного набора экспериментальных данных что-то никак не находится.

Сейчас я, например, беру каждую точку и её соседей и апроксимирую тем или иным образом искажение для каждой точки. Для произвольной точки x2,y2 нахожу ближайшую из калибровочного набора и использую вычисленную для неё апроксимацию чтобы получить искомые «недеформированные» x1,x2. Может быть это можно делать как-то оптом для всего набора точек сразу?.

 , ,

Stanson ()

RSS подписка на новые темы