LINUX.ORG.RU

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

Простая программная генерация видео и картинок без стороннего API

Форум — Development

Покажу простой способ генерации видео программами на Python и C/C++ без использования стороннего API. Вам так же потребуется ffmpeg, без него вы не сможете конвертировать файлы в читаемые форматы!

Зачем это нужно?

Можно экспериментировать, например вы можете создать видео максимального качества и проверять как оно будет эффективно сжиматься тем или иным видео кодеком. Можете даже создать картинку с градиентом в 64-битном цвете и с дизерингом, мало ли какие ещё извращения можно придумать. Можно ещё делать видео с быстро движущимися объектами и сохранять его в 1000 кадров в секунду и потом тестировать всякие интерполяторы движения и моушн блюры.

Способ 1: на Python

С помощью скрипта на Python можно создать видео. Просто сохраните этот код в какой-нибудь «main.py»

import os
import sys

state = 0; # переменная нужная для анимации смещения узора
w = 320 # ширина кадра
h = 240 # высота кадра
fps = 25 # кадров в секунду
duration = 2 * fps # сколько длится видео (2 сек)
buffer = bytearray(w * h) # для хранения данных кадра
# генерация кадров
while state < duration:
  for y in range(0, h):
    for x in range(0, w):
      buffer[y * w + x] = ((x + state) ^ y) % 256 # генерация узора
  os.write(sys.stdout.fileno(), buffer) # кадр записывается в вывод консоли
  state += 1 # немного сдвинуть узор в следующем кадре

Далее исполняете команду в консоли:

python main.py | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv

В результате у вас получится двухсекундное видео с узором out.mkv. Посмотреть демо гифку

Как это работает?

В командную строку Linux можно выводить не только текст, но и бинарные данные файлов, а так же эти данные можно перенаправлять в другую программу, в данном случае это ffmpeg который принимает RAW кадры и конвертирует их в видео. И в коде и в команде вызова должны совпадать fps/framerate и video_size/w/h иначе всё разъедется. Нельзя просто взять и написать данные пикселей в консоль через print, нужно записывать их в stdout как в файл через os.write. Если в коде изменить duration на 1, то создастся только один кадр с узором и его можно сохранить как картинку так:

python main.py | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -i pipe: out.png

Способ 2: на C/C++

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

C++

#ifdef WIN32 
  #include <fcntl.h>
#endif
#include <cstdio>
#include <iostream>
#include <cstdint>
#include <vector>

int main() {
  constexpr size_t fps = 25;
  constexpr size_t w = 320;
  constexpr size_t h = 240;
  constexpr size_t duration = fps * 5;
  constexpr size_t size = w * h;
  auto buffer = std::vector<uint8_t>(size);
  size_t state = 0;
#ifdef WIN32 
  setmode(fileno(stdout), O_BINARY);
#endif

  while (state < duration) {
    for (size_t y = 0; y < h; ++y)
    for (size_t x = 0; x < w; ++x)
      buffer[y * w + x] = (((x + state) ^ y) + state) % 256u;
    ++state;
    std::cout.write(reinterpret_cast<char*>(buffer.data()), size);
  }
}

Сборка и запуск:

g++ -Wall -O2 main.cpp -o prog
prog | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv

C

#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <malloc.h>

typedef uint8_t byte;

int main() {
  const int fps = 25;
  const int w = 320;
  const int h = 240;
  const int duratuion = fps * 5;
  const int size = w * h * sizeof(byte);
  byte *buffer = (byte*)malloc(size);
  int state = 0;
  freopen(NULL, "wb", stdout);

  while (state < duratuion) {
    for (int y = 0; y < h; ++y)
    for (int x = 0; x < w; ++x)
      buffer[y * w + x] = (((x + state) ^ y) + state) % 256;

    fwrite(buffer, 1, size, stdout);

    ++state;
  }

  free(buffer);
}

Cборка и запуск:

gcc -Wall -O2 main.c -o prog
prog | ffmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i pipe: out.mkv

Как сохранить в FFmpeg видео в полном качестве

Я специально не указывал выходной видео кодек для упрощения команд, но вы можете добавить в ffmpeg опции -vcodec libx264rgb -crf 0 для сохранения видео в lossless качестве. Если вы модернизируете программу и добавите в неё поддержку RGBA цвета, то помните что h264 не умеет сохранять прозрачность в кадрах и вам лучше использовать кодек FFV1.

Что ещё можно сделать

  • Можно сгенерировать видео на любом языке программирования, если на нём можно переключить стандартный вывод в бинарный режим.
  • По такой же логике можно и перенастроить поток ввода stdin в бинарный режим и передать в программу бинарные данные из ffmpeg, таким образом можно будет смастерить видео-фильтр. В общем надо сделать что-то типа того: ffmpeg | фильтр | ffmpeg. Вообще можно просто написать Frei0r фильтр на Си и использовать его в ffmpeg, но мой способ просто не требует никакого стороннего API.
  • Поток можно перенаправлять и в файл и потом этот файл скармливать ffmpeg’у, но учтите что видео будет совсем без сжатия и несколько секунд видео 1280x720 будут весить гигабайты. Сделать это можно так:
prog > video.dat
fmpeg -y -f rawvideo -pixel_format gray -video_size 320x240 -framerate 25 -i video.dat out.mkv
  • Раз можно сгенерировать сырое видео, то можно и создать сырой PCM звук и конвертировать его в аудио форматы. Можно например генерировать мелодии и сохранять их в pcm_s16le поток. Опять же переключив stdin в pipe режим вы можете получать аудио поток извне, обрабатывать его своей программой и передавать далее, таким образом у вас получится аудио фильтр и не надо никакого VST/LADSPA API.

Заключение

Это очень простой способ создания видео (для программиста). Если что, в ffmpeg уже встроены некоторые генераторы тестовых видео. Сохраняются ли гигабайты сырых кадров в оперативной памяти при использовании такого способа передачи или же на диске - мне это неизвестно, возможно что у такого способа есть какие-то ограничения на размер передаваемых данных. Помните что в передаваемом потоке данных нет никаких меток синхронизации и если что-то где-то потеряется в пути, то видео всё станет кашей, так что не пытайтесь передавать такой поток через net cat (я не пробовал).

 , , , ,

HPW-dev
()

Geeqie-1.7

Новости — Мультимедиа
Группа Мультимедиа

17 января 2022 года была выпущена новая версия просмотрщика изображений Geeqie. Это быстрая и легковесная программа, использующая библиотеку GTK-3 (сохраняется возможность сборки с GTK-2).

В новой верcии:

  • добавлена поддержка формата изображений JPEG XL;
  • добавлена поддержка архивов (например, *.zip);
  • поиск дубликатов изображений сделан многопоточным;
  • в контекстное меню добавлена команда копирования изображения в буфер обмена;
  • добавлена поддержка AppImage;
  • цвет фона теперь берётся из системной темы;
  • множество мелких улучшений и исправлений.

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

 

anarquista
()

Чего ждать в 2022 году

Форум — Talks

У меня тут, короче, вышел обзор главных событий 2021 и прикидки на 2022 по основным проектам, таким как GIMP, Inkscape, Kdenlive, Olive, Ardour и т.д. Размером примерно с «Войну и мир». Практически во всех случаях текст авторизован самими разработчиками, так что без фуфла :) На русском не было и не будет, сорян.

Из интересненького:

  • Ardour 7 грозятся зафиналить уже в этом году, прямо гарантируют. Самая заметная фича — запуск клипов в стиле Ableton Live.
  • Zrythm портанули на GTK4 и сразу на libadwaita, с использованием аппаратного ускорения. Релиз анонсировали буквально вчера. Там ещё разные интересные фичи.
  • Audacity скорее всего выпустит в этом году 3.2 с недеструктивными эффектами (VST3).
  • Ожидается релиз нотного редактора MuseScore 4 с перефигаченным интерфейсом и возможностью подключать как свой закрытый движок воспроизведения нот (будет качаться отдельно), так и любые инструменты VST3.
  • За прошлый год вышло два крутых синтезатора, VCV Rack 2 и Bespoke Synth. Команда Surge выпустила ещё один проект, до того проприетарный — монофонический синтезатор Monique, а на январь планирует релиз Surge XT (на базе JUCE).
  • За 2021 год PipeWire очень неслабо вломил и в принципе уже хорошо работает как полная замена пыщпыщаудио. С приложениями на JACK остаются кое-какие проблемы, но разработчик пайпвайра серьёзно относится к профикам, поэтому стоит ждать, что всё будет только лучше.
  • Inkscape, кажется, переехал на схему «один крупный релиз в год». Весной ожидается версия 1.2 с поддержкой многостраничности, динамическими направляющими и лёгкими улучшениями интерфейса.
  • Весь модный архитектурный стек (BlenderBIM, Homemaker, Topologic, IfcOpenShell) очень бодро развивается.
  • Команда Krita щас медленно приходит в себя после пятилетнего марафона работы над 5.0. Много интересных планов, пока не расставили приоритеты на год.
  • Выход GIMP 3.0 в этом году никто не гарантирует, но как минимум вместо одного разработчика уже два готовы допиливать (и допиливают) недостающие части порта на GTK3.
  • У darktable случатся релизы 4.0 и 4.2, цикл разработки только начался, пока мало известно.
  • В горизонте месяца отрелизится Siril 1.0 (привет астрофотографам).

https://librearts.org/2022/01/2021-recap-2022-preview/

 

AP
()

ZeroNet — p2p платформа хостинга сайтов и соцсеть

Форум — Development

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

  • Хранение данных осуществляется в простых текстовых файлах (JSON) с кэшированием в sqlite для быстрого доступа. Кроме JSON, разумеется, возможно также использование любых текстовых или бинарных форматов, но уже без поддержки автоматического построения таблиц sqlite.
  • Все данные подписаны ключами своих авторов, таким образом подделать авторство сайта невозможно. Также невозможно модифицировать чужой сайт.
  • Сайты хранятся по принципу торрента — любыми заинтересованными участниками сети. Отключить сайт, выведя из строя какой-либо сервер, невозможно.
  • Сайт остаётся работоспособен даже если остался на единственном узле или если компьютер посетителя сайта вообще отключен от интернета.
  • Если связи нет, можно продолжать работу с сайтом в обычном режиме: писать посты в блог, комментарии на форум и т.п. При появлении связи данные будут синхронизированы автоматически.
  • Передача данных между пирами осуществляется напрямую через IP-соединения и/или через Tor на усмотрение пользователя.
  • Первичный поиск пиров для сайта выполняется на трекерах собственного типа, либо на произвольных торрент-трекерах по всему миру. После установления связи, узлы обмениваются списками пиров и известных трекеров между собой.

Теперь к сути вопроса.

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

Активной разработки не ведётся уже более полугода. Изредка кто-то подтверждает мелкие PR, а значит, у кого-то всё же есть доступ к его учетной записи. На этом основании можно строить разные коспирологические теории, но мы сейчас не об этом.

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

Текущий драфт ченджлога можно посмотреть здесь: https://github.com/zeronet-enhanced/ZeroNet/blob/massive-rework/ZNE-ChangeLog/ChangeLog-0.8.0.md

Всё, что там описано, уже реализовано. Впереди еще многое другое.

Всех заинтересованных лиц призываю присоединиться к работе.

 , ,

wandrien
()

Федеративность vs P2P

Форум — Talks

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

Фундаментом нашего объединения является идея, изложенная в эссе «Protocols, Not Platforms»

И именно поэтому существует целый выводок реализаций как раз движков-платформ. Я и правда не понимаю, какое дело конечному пользователю будет до протокола, если он взаимодействует с конкретной платформой, к которой привязана его учётка. Код исполняется не на его машине и не под его контролем. Данные пользователя подконтрольны не ему, а черт знает кому. То, что там будет СПО, абсолютно параллельно. Суть СПО не святости концепции, а в том, чтобы знать, что за код работает с твоими данными. Не тот случай.

Возможно, ты используешь Mastodon неправильно

А может быть, всё проще, и это Mastodon спроектирован неправильно.

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

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

Что мешало сразу сделать дизайн, в котором пользователь — это универсальный криптографический ключ, не прибитый к платформе? А кружки по интересам… просто кружки по интересам!

Внутренняя политика […] Рассмотрим какой-нибудь инстанс. У него есть внутренняя политика. Она регулирует то, что происходит в стенах этого инстанса, между его пользователями. К ней относятся правила поведения, на каждом инстансе они свои. Регистрируясь на конкретном инстансе, ты соглашаешься с его конкретными правилами.

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

И если раньше админ группы в Фейсбуке был ограничен во власти по отношению к участникам группы средствами самого Фейсбука, то теперь «админ группы» обладает полной властью вместо Фейсбука.

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

Внешняя политика […] Тут, конечно, начинаются всякие страсти. Это комплекс всего, что происходит при общении между серверами. К вам, как гражданину своего инстанса, внутренней политикой скорее всего приставлен долг не порочить честь своего сообщества на междусерверной арене. […] Глушение. […] Отклонение медиа. […] Блокировка.

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

Да, и наконец, мне скажут типа: просто подними свой сервер, и своими данными управлять будешь только ты. Во-первых, не только я. Любому серверному приложению необходим хостинг с белым IP. А во-вторых, вот только технически это решение ничем не отличается от старого доброго блога на вордпресс и ленты RSS для экспорта всем желающим. Изобретение нового мира вышло каким-то… неубедительным.


В общем, я такой человек, который во всём найдёт изъяны. С ходу могу вспомнить только три примера, когда дизайн продукта меня полностью устраивал при знакомстве. Первый был, когда я познакомился с Ruby. Второй, когда открыл для себя Docker. И третий, когда увидел обновленный JS с let, const и стрелками.

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

Самое главное, чего не делает федиверс, он не провозглашает пользователя как объект первого класса в своей семантической модели. Всё так же объекты первого класса — это сервера, сервера, сервера.

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

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

В то же время, приложение на ZeroNet при желании можно продаунгрейдить до федеративного сервера, точно так же как федеративный сервер при желании архитектурно даунгрейдится до «Фейсбука». А вот обратно — не получится. Если в исходном дизайне не выполнено соответствующее разделение абстракций, то без полной переделки дизайна им просто неоткуда будет взятся. «Лишние» степени свободы платформы при желании можно скрыть, а вот несуществующие нарисовать не получится.

ZeroNet сейчас это макет самой себя, в котором ничего еще только не работает. Но блин… дайте мне 5 кодеров на питоне за еду и финансирование, чтобы им полгода было что есть. И вы обалдели бы от результата.

Допилить ZeroNet до убойной технологии не сложнее, чем с нуля реализовать стек Gemini вместе с сервером и браузером на GTK. Реально нужно 5-6 заинтересованных лиц и немного времени.

Сейчас ситуация такова, что на всей Земле не нашлось этих пяти лиц.

В общем, ладно… у меня нет желания размышлять, почему всё так вышло, и почему вместо действительно чумовой технологии, от которой сами «продвинутые пользователи» бы визжали, у пользователей выстреливает очередное… вот это. В конечном счёте, как тащить людей туда, куда они не хотят? Ну не хотят, и не надо.

Пойду куплю пива в связи со сдачей очередного проекта. Пошло оно всё подальше.


Спасибо commagray & CO за предоставленные для цитирования буквы.

 , ,

wandrien
()

firefox и bookmark

Форум — Desktop

Кас сделать в FF 90, чтобы закладки показывались только в новой вкладке? Я выбрал меню из списка «показывать только в новой владеке», а оно не работает.

 ,

theLORdweller
()

Firefox и журнал.

Форум — General

Времени суток. Каким образом можно удалить/просмотреть историю в firefox. Недавно захотел удалить из журнала некоторые сайты, и столкнулся с тем что просто не удаляет. Из менюшек самого браузера(ниче не делает, просто). Это ладно. Структура каталогов и где хранится история - также мне не ясна, на сайте мозилы , я не нашел описаний как это сделать(тупой я и слепой да). Буду рад если кто-то кинет ссылками по этому поводу. Спасибо заранее…

 

nioelumiijke
()

Xfce4 и docklike-plugin

Галерея — Скриншоты

Шёл 2020-й год и для новой (хотя она уже пару лет как «новая») панели Xfce появился-таки свой современный докоподобный таскбар: Docklike-plugin. И теперь больше не надо тащить и кое-как прикручивать DockBarX.
Настроек по сравнению с тем же докбаром куда меньше и вообще всё пока довольно простенько, зато выглядит абсолютно нативно — точно так же, как и обычный таскбар в режиме «только значки».
Проект пока ещё активно развивается — читай, функциональность только самая базовая. Например, фильтрацию окон по рабочим столам добавили буквально на днях.
Остальной софт такой же остромодный — Seamonkey, Ario и Double Commander. По-моему, ни одна из этих программ, как и сама крыса, серьёзно за десяток лет не поменялась — и наверное, это неплохо.
А шрифты такие огромные потому, что экран — 12 дюймов.

 , ,

dogbert
()

Веб-разработка в Vim

Форум — Web-development

Предлагаю обсудить и поделиться опытом по веб-разработке в Vim.

Я использую Vim в терминале termite (со своими патчами для дефолтного копипаста и прочее) с цветовой схемой gruvbox: как для терминала, так и для Vim.

Этот клавиатура-ориентированный vim-like терминал я упомянул не столько потому, что у него реализованы режимы как Vim (insert mode, selection mode, выделение клавиатурой включая блочное), а потому, что у него есть приятная фича (которую можно наблюдать в iTerm2 для OS X) при работе Vim'а в нём, а именно цвет курсора изменяется в зависимости от цвета символа, на котором находится курсор, а также при выделении цвет выделения повторяет цвет слов/строк (но без инвертирования где нужно, может еще допилят), скриншот.

Менеджер плагинов:

Перед обсуждением плагинов и настроек, хочу подчеркнуть почему я использую менеджер плагинов vim-plug: перепробовав все известные менеджеры плагинов, включая недоменеджер pathogen, остановился именно на vim-plug потому, что он самый быстрый (параллельная установка/обновление, к-во потоков настраивается), имеет приятный интерфейс, краткий синтаксис, а самое главное позволяет настроить загрузку или отключение плагинов по filetype и/или первому вызову самого плагина, это не только ускоряет старт/работу Vim, но и помогает разрулить конфликты некоторых плагинов, простой пример:

Plug 'tpope/vim-endwise',   { 'for': [ 'ruby','vim','sh','zsh' ] }
Плагин endwise будет загружен только для ft=ruby,vim,sh,zsh, т.к. если этот полезный плагин работает одновременно с не менее полезным плагином delimitMate, то возникает конфликт в файлах с ft=css,js и везде, где после открытия скобки нужен автоматический переход на следующую строку и автозакрытие скобки.

Кроме всего прочего, отдельно от веб-разработки-related для самого вима у меня такое:

Автоматическое переключение на английский в Normal mode и обратно на предыдущий в Insert mode:

Конечно же нужно решать проблему с локалями (т.к. веб-разработка, в отличие от программирования иногда ведется на отличных от английского языках), а именно с неудобством при их переключении в Normal mode и обратно, самое лучшее решение, это установка в систему xkb-switch + плагин в Vim для него.

Plug 'lyokha/vim-xkbswitch'
let g:XkbSwitchEnabled       = 1
let g:XkbSwitchLib           = '/usr/lib64/libxkbswitch.so'
let g:XkbSwitchIMappings     = ['ru']
let g:XkbSwitchSkipIMappings = {'*' : ['[', ']', '{', '}', "'"]}
Теперь не нужно переключать на английский входя в Normal mode и на русский обратно в Insert mode, переключение происходит автоматически. Очень удобно.

Линейка номеров строк:

set nu
set nuw=4
autocmd InsertEnter * set nornu
autocmd InsertLeave * set rnu
в Insert mode - с номерами строк всё как обычно, в Normal mode (точнее после первого входа в insert и выхода обратно в normal) включается типа линейки: скриншот.

Автоматическая паста с отступами:

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

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Замена заменяемого без удаления (проблема забивания иксового буфера обмена):

Чтобы заменить слово или кусок окруженный делиметрами без удаления в иксовый буфер, можно использовать такую настройку на хоткей S :

nnoremap <silent> S :set opfunc=PasteReplace<CR>g@
function! PasteReplace(type, ...)
    if a:0
        silent exe "normal! `<" . a:type . "`>p"
    elseif a:type == 'line'
        silent exe "normal! '[V']p"
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]p"
    else
        silent exe "normal! `[v`]p"
    endif
endfunction
nmap SS S$
Теперь если нужно заменить слово без его удаления, можно просто: Sw , Si" , Si( , и т.п.

Проекты/сессии:

Плагин vim-startify - стартовый экран, можно настроить на сессии и букмарки, чтобы каждый раз не открывать то же самое в сплиты/табы/буферы.

Документация:

Для открытия документации в браузере (как минимум для того, что нас интересует: HTML, JavaScript, CSS, SCSS, LESS, Ruby, Rails, Django, PHP и т.п.) исходя из из ft= и положения курсора, удобно замапить на F1:

Plug 'Keithbsmiley/investigate.vim'
nnoremap <F1> :call investigate#Investigate()<CR>

Автокомплит и сниппеты:

В отличие от YouCompleteMe, автокомплитер neocomplete не тормозит (при работе и старте), не нужен питон (но нужен lua), а всё остальное такое же (для веб-разработки). Интегрируется с родным движком сниппетов neosnippet, который работает как с родными, так и универсальными vim-snippets (объединенные Snipmate & UltiSnip).

Настройка для навигации по комплиту через Tab (сам комплит всплывает автоматически, можно настроить обратное):

imap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
if has('conceal')
  set conceallevel=2 concealcursor=i
endif

ZenCoding/Emmet:

Полнофункциональный Emmet для Vim: emmet-vim

Работает как нужно, но по дефолту неудобный (как по мне) хоткей <c-y>, , я настроил себе на jk . Т.е. Esc у меня kj , а дополнить jk . Первое время пользовался F4, привожу настройки, но jk намного удобнее. Просто на Tab настроить нельзя (иначе как пользоваться Tab?).

Plug 'mattn/emmet-vim',           { 'for': ['html','xhtml','css','sass','scss','less'] }
au FileType html,css,sass,scss,less imap <expr><F4> emmet#expandAbbrIntelligent("\<tab>")
au FileType html,css,sass,scss,less imap <expr>jk   emmet#expandAbbrIntelligent("\<tab>")
au FileType html                    imap <C-\>      <CR><CR><Esc>ki<Tab>
Плагин MatchTag - для отображения парных тегов.

Кроме Emmet'а для Vim существует аналог: Sparkup (нужен питон, не пробовал).

Отображение отступов:

Можно настроить каким символом и цветом отображать линии отступов, я настроил на хоткей <A-i> , альт как непечатаемый символ, так что проще посмотреть настройку склонировав репу на гитхабе и заглянув в .vimrc (или нажать C-v A-хоткей), скриншот.

Plug 'Yggdroot/indentLine'
let g:indentLine_enabled    = 0
let g:indentLine_char       = '¦'
let g:indentLine_color_term = 239
let g:indentLine_color_gui  = '#A4E57E'
nmap ^[i :IndentLinesToggle<CR>

Подсветка синтаксиса:

Plug 'tpope/vim-haml',            { 'for': 'haml'   }
Plug 'wavded/vim-stylus',         { 'for': 'stylus' }
Plug 'groenewege/vim-less',       { 'for': 'less'   }
Plug 'digitaltoad/vim-jade',      { 'for': 'jade'   }
Plug 'slim-template/vim-slim',    { 'for': 'slim'   }
Plug 'othree/html5-syntax.vim',   { 'for': 'html'   }
Plug 'cakebaker/scss-syntax.vim', { 'for': 'scss'   }

Plug 'hail2u/vim-css3-syntax',    { 'for': ['html','css'] }
augroup VimCSS3Syntax
  autocmd!
  autocmd FileType css setlocal iskeyword+=-
augroup END

Проверка синтаксиса:

Для проверки синтаксиса используется Syntastic + сторонние чеккеры:

Plug 'scrooloose/syntastic', { 'for': ['ruby','html','css', 'javascript', 'haml'] }
let g:syntastic_auto_jump           = 1
let g:syntastic_error_symbol        = '✖'
let g:syntastic_warning_symbol      = '►'
let g:syntastic_javascript_checkers = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_html_checkers       = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_ruby_checkers       = ['rubylint' ] " gem install ruby-lint
let g:syntastic_haml_checkers       = ['haml-lint'] " gem install haml-lint
let g:syntastic_css_checkers        = ['csslint'  ] " sudo npm install -g csslint
let g:syntastic_css_csslint_args    = "--ignore=zero-units"

Деобфускация / beautify'еры:

Плагин vim-autoformat работает со сторонними 'formatprograms', например js-beautify для HTML, CSS и JavaScript. autopep8 для питона и т.д. Всё это должно быть установленно.

Plug 'Chiel92/vim-autoformat'
let g:formatprg_args_javascript = "-j -q -B -f -"
noremap  <F8>   :Autoformat<CR><CR>
vnoremap <C-F8> gq

JavaScript:

Дефолтная поддержка JavaScript в Vim на довольно низком уровне, так что необходимы плагины как для самого JS, так и для библиотек, плагин javascript-libraries-syntax поддерживает почти все основные либы: jQuery, underscore.js, Backbone.js, AngularJS, RequireJS, Sugar.js, Jasmine и т.д.

Plug 'moll/vim-node'
Plug 'pangloss/vim-javascript',      { 'for': 'javascript' }
Plug 'jelera/vim-javascript-syntax', { 'for': 'javascript' }
let javascript_enable_domhtmlcss = 1
let g:html_indent_inctags        = "html,body,head,tbody"
let g:html_indent_script1        = "inc"
let g:html_indent_style1         = "inc"

Plug 'othree/javascript-libraries-syntax.vim', { 'for': 'javascript' }
let b:current_syntax       = 'javascript'
let g:used_javascript_libs = 'angularjs'

Также полезен tern_for_vim (сам Tern должен быть установлен), который умеет в 'Jump to the definition', 'Find the type' и т.д.

Пробельные символы:

По A-w показывает, по \-dw удаляет. Перевести все табы в пробелы (вдруг кто не знает), в Vim: :retab .

Plug 'ntpeters/vim-better-whitespace'
let g:better_whitespace_enabled = 0
nmap ^[w :ToggleWhitespace<CR>
nmap <Leader>dw :StripWhitespace<CR>

И кое-какие настройки по-мелочи:

set splitbelow
set splitright
inoremap  kj           <Esc>
map       gm           :call cursor(0, virtcol('$')/2)<CR>
nnoremap  <F12>f       :exe ':silent !firefox %'<CR><C-l>
nnoremap  <F12>c       :exe ':silent !chromium-browser %'<CR><C-l>
1-2 строки: для нормального открытия (слева направо) сплитов.
3: Esc на kj - мегаудобно.
4: для попадания на средину строки.
И последние две для предпросмотра в браузерах.

Мой ~/.vimrc

Кто что использует и как, кроме вышеуказанного?

 

VimCasts
()

Принёс сюда девятимесячный тест термопаст

Форум — Talks

Ролик PRO Hi-Tech.

Кратко:

Суть теста – посмотреть, что происходит с термопастами за 9 месяцев, высыхают или нет.

Noctua NT-H1. Осталась такой же пластичной.

GD900. Также осталась пластичной, как и была, совсем чуть-чуть загустела.

Arctic MX-4. Была самой жидкой из всех, такой и осталась.

Gelid GC Extreme. Единственная из всех подсохла. К покупке не рекомендуется, к тому же, она самая дорогая из рассмотренных.

Температуры средние и под максимальной нагрузкой со временем изменились не более, чем на 3-4 градуса.

Мне было интересно посмотреть, надеюсь, кому-то тоже будет полезно.

 ,

the_real_kinik
()

Переехал на кучу утилит переписаных на Rust

Форум — Talks

Тег «угадай автора по заголовку».

Q: Зачем?

A: Ради эксперимента, повысится комфорт пользования терминалом или нет.

Q: Причем тут Rust?

A: Ни при чем, но из-за нативности и отсутствия GC на нем толпа людей побежала переписывать что ни попадя. С таким же успехом можно было бы и npm install, но тормозило бы. Ближе opam install или go get

Теперь мой терминал по истине свистит и пердит. Даю список если кому надо.

  • alacritty - GPU ускоренный терминал.
  • alias cat=bat- cat с хорошей подсветкой синтаксиса и нумерацией строк и пейджером.
  • broot - навигатор по каталогам, который одновременно показывает дерево, но адекватно себя ведет с громадными каталогами, показывая их по чуть-чуть.
  • dust - утилита для исследования места занимаемого каталогами, сортирует деревья файлов начиная с самых больших каталогов.
  • alias ls="exa -l --group-directories-first" ls с хорошими дефолтами, tree встроено.
  • rip Утилита для удаления файлов с разными удобными фичами и восстановлением
  • hors "How do I parse float in javascript?" - находит короткий ответ в интернетах и отвечает. Чуть лучше работает чем оригинал - howdoi.
  • mdcat - cat для Markdown, для отображения удобочитаемой формы документа. Ссылки делает сносками.
  • alias grep=rg - очень быстрый и удобный grep
  • starship - shell command prompt, показывает кучу полезной информации в зависимости от контекста, например git branch если в репозитории, версии софта и ЯП если в каталогах с сорцами, hostname если зайти по ssh.
  • tokei - сборщик статистики по ЯП и строкам кода в деревьях исходников.
  • hyperfine - бенчмарк утилита, time на стероидах.
  • tldr- сокращенная версия man, показывает как чем пользоваться в примерах, а не выдавая полную справку. Страницы поддерживаются сообществом для громадного количества утилит. Изначальный проект - https://tldr.sh/
  • topgrade - универсальная утилита обновления. При запуске пытается обновить все что видит - системные пакеты, vim пакеты и так далее.
  • runiq - быстрый sort | uniq с разными алгоритмами внутри.
  • fd - быстрый и удобный find, удобно чтобы не вспоминать заковыристые ключи
  • fselect - поисковик файлов с SQL-like языком запросов
  • sd - как sed, только интуитивный
  • i3status-rs - Сразу i3status+i3blocks. Плюс батарейки к i3blocks, которые как я понял автор решил убрать.
  • onefetch - Вроде neofetch, но для сорцов. Просто запустите эту штуку с корня любого git репа, клонированого локально
  • wasmtime - JIT runtime для WASI стандарта. Пускалка WebAssembly приложений.
  • scriptisto - «shebang-интерпретатор» для компилируемых языков, прозрачно собирает и кеширует нативные сборки кода

Что не зашло совсем

Все вышеперечисленое ставится через cargo install <package_name> (кроме alacritty), название смотрите на страницах. Сам cargo и Rust ставятся через

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

P.S. Призываю остальных взять ЯП вашей секты и поставить такой эксперимент и отписаться. Да-да, расскажите как вы пользовались ls на Java. Пользователей emacs прошу не беспокоить

 , , ,

vertexua
()

Отключение всех заплаток ядра разом (Meltdown, Spectre, L1TF, MDS)

Форум — Talks

Может кому интересно. В актуальные ядра (5.1.2, 5.0.16, 4.19.43, 4.14.119, 4.9.176) добавили параметр для отключения всех заплаток разом.

mitigations=off

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

 , , , ,

Kron4ek
()

Впечатления после полугода, проведенных с MacBook

Форум — Talks

Добро пожаловать в мой ЖЖ^A^K

Ранее я уже писал небольшой пост на тему того, какие впечатления у меня были после использования MacBook Pro 13" mid 2018, то есть недавно вышедший на тот момент, и все еще последний на текущий.

Главной особенностью тогда было то, что macOS я до этого не использовал, и я хотел написать как можно более объективное впечатление от человека, который большую часть жизни использовал GNU/Linux. Если с предыдущим постом вы не знакомы, то я советую его прочитать, так как буду отталкиваться от того, что изменилось с тех пор.

После покупки MacBook я начал более активно перемещаться по миру, а так как летать с довольно тяжелым Lenovo G500 мне не хотелось, то в итоге получилось, что я пользовался почти только macOS около полугода.

Два дня назад я забрал из магазина Lenovo заказанный еще месяц назад ThinkPad P1, и этот пост уже пишется не с MacBook и macOS, а с ThinkPad и GNU/Linux (а если конкретнее – NixOS). Чему я несказанно рад, но это – после.

Итак, те вещи, которые мне понравились изначально, и с которыми я испытал проблемы за это время:

  1. Тачпад. На деле использование тачпада и его жестов постоянно привело меня к протертым пальцам. Я никогда не нажимал на него сильно, и управлял легким касанием. Возможно, у меня очень тонкая кожа на пальцах, но реальность оказалась такой – через некоторое время использование тачпада начало вызывать у меня боль. Тем не менее, тачпад действительно лучший на рынке, и этот пункт не стоит воспринимать как недостаток непосредственно этого тачпада, но использования тачпада для меня в целом.
  2. Пальцетыкательная полоска. Полноценное её использование оказалось затруднено её нахождением ниже монитора. Не то, чтобы мне было совсем лень переводить взгляд под монитор, но в процессе работы это вышло не очень удобно. В итоге пальцетыкательную полоску я просто перестал использовать, и она так и оставалась «мертвым грузом». Стоит отметить, что она также иногда зависала, и спасала только перезагрузка.
  3. Клавиатура. Несмотря на то, что «в 2018 году Apple исправила клавиатуру» – на деле это оказалось совсем не так. Некоторые клавиши западали, после чего возвращались к исходному состоянию самостоятельно (при этом чистить их явно не всегда помогало, но после того, как я перестал на это обращать внимание – понял, что оно через пару дней проходит само и… появляется где-то на другой кнопке). На данный момент у меня клавиша «о» очень часто печатает не один символ, а два. В итоге печатать длинные тексты без многократной вычитки становится проблемно.

И те пункты, к которым отношение в целом не изменилось:

  1. Возможность переназначать клавиши я по прежнему доволен – практически все мои use-case оно покрывало.
  2. Горячие клавиши. Аналогично предыдущему пункту.
  3. Автономность. MacBook действительно обеспечивает хорошую автономность, но только до тех пор, пока совершаются какие-либо простые действия. Точно также и с работой охлаждения. Как только начинаешь делать что-то – автономность уже не так радует, и носить с собой зарядник все равно приходилось.

Все те пункты, которые я включил тогда в «что мне не понравилось» – остались без изменений. С ними можно только сживаться, и каким-либо образом полноценно исправить оказалось невозможно.

А теперь переходим к новому!

Что для меня открылось положительного после многих месяцев использования:

  1. Работа с внешними мониторами. Просто превосходно. Операционная система запоминает разные мониторы и настройки к ним, различные конфигурации когда я подключаю только один из них и так далее.
  2. Простота ввода кавычек и длинных тире по умолчанию.
  3. Power nap. В спящем режиме macOS уведомляет о новых сообщениях подобно телефону, ибо иногда проверяет новую почту, сообщения et cetera.

Что для меня открылось отрицательного после многих месяцев использования:

  1. Нестабильность macOS. Как минимум дважды у меня случалось падение ядра, а с переключением раскладки клавиатуры постоянно творилось что-то странное.
  2. Медленная загрузка. После выключения macOS загружалась до 5-10 минут, и найти причину так и не удалось.
  3. Регистронезависимая файловая система по-умолчанию. Невозможность сделать git clone ядра для меня оказалось удивлением. Решается только костылями.
  4. Несмотря на прогрессивность USB-C – носить с собой большое количество переходников надоедает. Иногда хочется просто положить ноутбук в рюкзак.
  5. Автоматическое исправление текста при печати. На деле это больше мешало и корежило текст. В итоге вычитывать все равно приходилось, но уже не на ошибки, а на «macOS решил написать другое слово, а ты не заметил».
  6. Из-за металлического корпуса он часто был наэлектризован. Можно сколько угодно говорить о том, что «не вставляй в плохие розетки», но в условных кофешопах ты не выбираешь.

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

По моему (теперь уже можно сказать, что полноценному) опыту использования я пришел к выводу, что единственный приемлимый use-case для MacBook и macOS – смотреть YouTube и листать 4chan сидя в отхожем месте. Вероятнее всего, под данный use-case я MacBook и оставлю.

 , ,

Deleted
()

Вопрос по диалогу сохранения в FireFox

Форум — Desktop

Давно хочу перейти с хрома на ФФ, но столкнулся с стем что ФФ при сохранении файлы с разным расширением открывает диалог сохранения в разных каталогах.

Столкнулся с этим на DevianArt сохранял картинки одного художника и при сохранении пользовался ПКМ на картинке и в меню сохранить и через пкм на кнопке download, часть картинок он предлагает записать в новом каталоге (текущего художника) часть в предыдущем куда сохранял другого художника картинки (для разных художников сохраняю в разные каталоги). В хроме такого поведения не встречал.

Вопрос кто-нибудь с таким поведением сталкивался ? это как то лечится ?

 

svsd_val
()

Про статическую типизацию и безопасный доступ к памяти

Форум — Development

 , , ,

RazrFalcon
()

Страхи и ужасы ubuntu 18.04

Форум — General

Полез я тут посмотреть что с потреблением диска на ноуте (стоит 18.04) и волосы мои буквально зашевелились...

5,7G	/snap
7,5G	/var
sudo du -h -d 1 /snap/
1,6G	/snap/skype
798M	/snap/core
1,7G	/snap/gnome-3-26-1604
24M	/snap/gnome-calculator
1,4G	/snap/discord
180M	/snap/gnome-logs
4,0K	/snap/bin
142M	/snap/gnome-characters
50M	/snap/gnome-system-monitor
5,7G	/snap/

sudo du -h -d 1 /var/log/
1,6M	/var/log/installer
4,0K	/var/log/dist-upgrade
8,0K	/var/log/hp
132K	/var/log/apt
8,0K	/var/log/unattended-upgrades
4,0K	/var/log/speech-dispatcher
4,0K	/var/log/tor
20K	/var/log/libvirt
4,0G	/var/log/journal
4,0K	/var/log/gdm3
36K	/var/log/cups
4,5G	/var/log/

Божечки ты мой, что ЭТО такое? Как, каким путём мы умудрились прийти к ЭТОМУ? Как теперь с ЭТИМ жить-то? Одно приложение весит ПОЛТОРА ГИГА??? Серьёзно? Системный лог 4 гига?? Серьёзно??

А как быть с хостами виртуализации? Что мне в виртуалку давать? Раньше под рут 20 гиг было с большим запасом. А что теперь?

Что с этим делать? Как НЕ использовать ЭТО? Я в шоке, просто в шоке.

А что будет если места не хватит?

 ,

targitaj
()

Django в 2017 году и его подводные камни

Форум — Web-development

Осваиваюсь понемногу в питоне и появилась неоднозначность в выборе django как основного инструмента. Да он еще популярен, но насколько актуален сейчас? Не мало народу хейтят его, говоря о чем-то стронем типа flask...

Есть люди, которые долгое время пользовались django и могли бы поведать его подводные тайны? Можно любые недостатки и вообще свое мнение по нему (хочу сразу окунуться в то, с чем могу столкнуться и понять насколько это критично вообще).

 , ,

wist512
()

Безоговорочный выбор ЯП для веба.

Форум — Web-development

Некоторое время выпал из веб разработки, но хотелось бы вернуться и немного завис на выборе технологий.

Разбор.

-Статические языки. Это производительность и экономия ресурсов сервера, а значит денег на сервер. Плюс очень сильно помогает от мелких ошибок, особенно когда долго за кодом и начинаешь путаться (тут IDE или компилятор умело даст по рукам, сказав что ты запутался - очень помогает). Ну а так имеется нормальное (настоящее) многопоточное программирование (и чаще все в одном процессе).

-Java - язык очень нравится (честно, считаю наилучшим для бизнеса), но ужасно не нравится энтерпразные решения и библиотеки (один ужас... всякие ЕЕ и даже Spring для простого или среднего пет-проекта, смотрятся ужасно). Оверхед на оверхеде, читать исходники очень сложно, порой обычное решение обернуто в избыточное число объектов. Про сервлеты (и ЕЕ) я уже говорить не буду, рассматривал постройку приложения на embedded-серверах (Jetty, Undertow, Netty). Очень нравится то, что можно реализовать все что нужно через maven (гредле), хотя конечно nginx придется ставить, но вот эта вся мощь - что юзаешь один язык, очень круто. Крайне бесят XML.

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

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

-С++ и Раст - слишком хардкорен для меня и думаю для веба в целом тоже.

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

-PHP и node.js - пропущу в обзоре.

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

И так, предлагаю дискусс - что выбрать «N», или «Y» и почему вы так решили?

PS пропустил (и не знаю о них) - руби, свифт, шапр и т.д.

 

wist512
()

Кто пробовал server side rendering на VUE?

Форум — Web-development

...через nuxt или как-то еще. Как там вообще с производительностью? Читаю вот этот мануал, все вроде красиво и правильно. Но в трекере висят тикеты с предложениями по оптимизации, где подозрительно большие цифры указывают (300+ ms). Правда не знаю насколько сложные там страницы.

А вообще VUE с виду приятен и понятен. В отличие от react и angular :)

 

Vit
()

vue.js: хочу глобальные переменные, переводы и макросы. Как правильно?

Форум — Web-development

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

Но помимо этого хочется еще несколько вещей. Возможно, хочется неправильно и зря, тогда поправьте как надо:

1. Как вообще принято переводы делать? Сейчас у меня весь яваскрипт фигарится в общий бандл, и делаются отдельный бандлы для каждого языка. Типа, клиент один раз грузит нужный язык и на ходу переключать не надо.

2. Вроде как логично переводы внутри компонентов держать, но внутри .vue ничего для подобного не предусмотрено (расширить-то можно, но не хочется лисапедить).

3. Хотя переводы в основном привязаны к компонентам, бывают еще и глобальные. А как принято к ним лезть, и как показывать, что в одном месте нам нужен локальный перевод, а в другом глобальный.

4. Иногда хочется внешние константы в шаблон заэмбедить. Например, в конфиге приложения я задаю размеры превьюшек. А потом их надо явно указать в стилях. Или, например, в темплейте мне нужно испортнуть структуру со статусами, типа { visible: 1, closed: 2, deleted: 3 }. Лучше бы такое сразу заэмбедить и не дергать хелперы при рендеринге. У меня в кастомном лисапеде под это есть макросы с отслеживанием зависимостей, но не уверен что такое в vue прокатит.

5. При использовании всяких vueify и vue-loader, можно ли сделать так, чтобы stylus понимал npm-пути в @import? То же самое касается jade и т.п.

6. Вопрос больше про vueify и vue-loader. У меня есть несколько приложений, хочется «смержить» их файловую систему. Чтобы когда указывают относительные пути, компонент на этапе бандлинга искался по всем приложениям, а не только по текущему. Это бывает удобно если хочется организовать виджеты в дерево, вместо одной плоской кучи-малы.

 ,

Vit
()