RSS
Pages: 1 ... 4 5 6 7 8 9 10 11 12 13 14
[>] Re: Что с станцией lessmore?
idec.talks
Difrex(dynamic,1) — Difrex
2020-09-14 13:35:35


Т.е. я считаю, что "\n" - это разделитель списка и если в конец вносить его, то получится, что последний элемент списка - это всегда пустая строка.

Но в случае чего, я могу добавить перенос строки.

> В системе, когда у нас последняя строка не содержит \n, мы не можем отличить ситуацию, прочиталась ли строка целиком?
Это справедливо только для имен эх, а вот id сообщения всегда можно понять прочитался ли он полностью.

[>] Re: Что с станцией lessmore?
idec.talks
Difrex(dynamic,1) — Andrew Lobanov
2020-09-14 19:41:40


> У меня даже emacs в файлах в конце '\n' ставит :)
У меня тоже. Но это все таки данные не совсем для человека.

Ты же не будешь править тело сообщения поинта если оно пришло без \n в конце, а просто запишешь в базу.

// Newline в конце добавлю, но фетчер у меня умеет и так и так.

[>] Читаем почту в GNU Emacs
difrex.blog
Difrex(tavern,23) — All
2018-08-21 14:00:20


И так по обсуждению из вот этого вот треда(стартовый пост) у меня получилось настроить Gnus для работы с пятью почтовыми аккаунтами и отказаться от Evolution.

На самом деле связка получилась такая: fetchmail забирает письма, раз в 5 минут и запускает procmail для фильтрации сообщений, procmail сохраняет сообщения в $MAILDIR, дальше уже Gnus читает почту и показывает ее. Чтобы иметь нормальные уведомления я использую индексер почты mu, i3blocks запускает раз в 30 секунд скрипт проверки на новые письма и отправляет уведовления через libnotify, ну и иконку на панели рисует.

Вот так примерно это выглядит в ASCII-арте:


+-----------+ +------------+ +------------+ +------------+
| fetchmail | |procmail | |Maildir | |Gnus |
| +-----+filters +----+ +----+ |
+----+------+ +------------+ +-----+------+ +------+-----+
| | |
| | |
| | |
| +--------------+ +-----+------+ +-----+-----+
| |i3blocks | |mu indexer | |BBDB |
| |libnotify +----------+ | |contacts |
| +--------------+ +-----+------+ +-----------+
| |
| |
| +-----+------+
+------------------------------+systemd user|
|and timers |
+------------+


> Такие cхемки, кстати, очень удобно рисовать в artist-mode

Я настраивал все на Arch Linux, но на самом деле это все заработает в любом GNU Linux.

## Ставим пакеты

Ставим пакеты:


sudo pacman -S mu fetchmail procmail


Ставим BBDB в Emacs


M-x package-install RET bbdb RET
M-x package-install RET all-the-icons-gnus RET


BBDB нам нужен для автодополнения контактов в поле To. Да и вообще это хорошая быстрая база контактов для Emacs. А вот пакет all-the-icons-gnus рисует красивые иконки :).

## Правим конфиги

### fetchmail

Для начала нам необходимо настроить fetchmail, который будет забирать почту по IMAP/POP.

Редактируем ~/.fetchmailrc:


set daemon 300 # fetch mail every 5 minutes
set logfile ~/Mail/fetchmail.log # Logfile

poll imap.gmail.com with proto IMAP
user 'YOU_USER' there with password 'YOU_PASSWORD'
options ssl keep
mda 'procmail -d %T'


Подобным образом определяем все свои аккаунты.

Чтобы не использовать пароли в открытом виде можно наложить патч на fetchmail.

### procmail

Для фильтрации почты и расскидывания ее по каталогам будем использовать procmail - у него отличная гибкая система фильтров на регекспах.

Редактируем ~/.procmailrc:


MAILDIR=$HOME/Mail # You'd better make sure it exists

DEFAULT=$MAILDIR/mbox/
LOGFILE=$MAILDIR/log
LOCKFILE=$HOME/.lockmail

:0 # socials
* ^From.*@.*(twitter|vk\.com|facebook|golos\.io)
social/

:0 # JIRA
* .*Subject.*(\[JIRA\]|\[WGJIRA\]).*
jira/

:0 # Gitlab
* ^From.*gitlab@gitlab.*
Gitlab/


Свои фильтры пишем дальше аналогично - тут все просто. Да, и убедитесь, что каталог `$MAILDIR` существует.

### msmtp

msmtp эта штука, которая позволяет отправлять письма через нужный сервер smtp. Определяет аккаунт она по полю From.

Редактируем ~/.msmtprc:


defaults
auth on
tls on
logfile ~/.msmtp.log
tls_certcheck on
tls_trust_file /etc/ssl/cert.pem

account difrex
host smtp.googlemail.com
port 587
from my.mail@gmail.com
user USERNAME
password PASSWORD


Аналогично для остальных аккаунтов.

### Systemd

Теперь необходимо написать нужные юниты и таймеры. Юнит для fetchmail будет выглядеть так:

~/.config/systemd/system/fetchmail.service


[Unit]
Description=Fetchmail
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/fetchmail

[Install]
WantedBy=default.target


Включаем и запускаем его:


systemctl --user enable fetchmail.service
systemctl --user start fetchmail.service


Теперь fetchmail будет стартовать после успешного логина в систему.

Настроим индексацию почты в mu:

~/.config/systemd/user/mu.timer


[Unit]
Description=mu mail indexer timer
Documentation=man:mu(1)

[Timer]
OnCalendar=*:0/5

[Install]
WantedBy=timers.target



И сервис

~/.config/systemd/system/mu.service


[Unit]
Description=mu email indexer
After=fetchmail.service

[Service]
Type=oneshot
ExecStart=/usr/bin/mu index
Environment=MAILDIR=/home/difrex/Mail # тут нужно указать свой MAILDIR


Включаем и стартуем


systemctl --user enable mu.timer
systemctl --user start my.timer


### i3blocks

Настроим вывод значка с колличеством непрочтенных писем в i3bar и отправку уведомлений. Для этого напишем простой скрипт на bash.

~/.config/i3/mail.sh


#!/bin/bash

MAILDIR=/home/difrex/Mail; export MAILDIR # тут нужно указать свой MAILDIR
COUNT="$(/usr/bin/mu find date:15m..now and flag:unread 2>/dev/null | wc -l)"

# Write notify lock
write_notify_lock() {
mkdir -p ~/.cache
echo $COUNT > ~/.cache/.mail_notify_lock
}

# Cleanup lock
clean_notify_lock() {
rm -f ~/.cache/.mail_notify_lock
}

if [[ $COUNT -gt 0 ]]; then
if [[ ! -f ~/.cache/.mail_notify_lock ]] || [[ $COUNT -gt $(/usr/bin/cat ~/.cache/.mail_notify_lock) ]]; then
write_notify_lock
/usr/bin/notify-send 'New mail' "$(/usr/bin/mu find date:15m..now and flag:unread 2>/dev/null | tail -1)"
fi
else
if [[ -f ~/.cache/.mail_notify_lock ]]; then
clean_notify_lock
fi
fi

echo $COUNT


> Не забываем сделать скрипт исполняемым

И в конфиг i3blocks.conf нужно добать секцию с нашим скриптом:


[mail]
label=
interval=30
command=~/.config/i3/mail.sh


Выглядит иконка в баре вот так:

А уведомление в dunst так:

## Gnus

Переходим к самому интересному, а именно к настройке Gnus.

Редактируем файл ~/.gnus.el.


;;; .gnus.el --- GNUs configuration
;;; Commentary:
;;; Code:

(require 'all-the-icons-gnus) ;; Наводим красоту
(all-the-icons-gnus-setup)

(setq user-mail-address "my_email@example.com") ;; Будет по-умолчанию в поле From
(setq user-full-name "Denis Zheleztsov") ;; Устанавливаем, как нас зовут

;; Показываем, что нужно смотреть в MAILDIR
(setq gnus-select-method
'(nnmaildir "mail" (directory "~/Mail"))
mail-sources '((maildir :path "~/Mail" :subdirs ("cur" "new")))
mail-source-delete-incoming nil)

;; arbitrary name after "nnmaildir+"
(setq gnus-message-archive-group "nnmaildir+mail:outbox")
(setq message-sendmail-envelope-from 'header)
(setq mail-envelope-from 'header)
(setq message-send-mail-function 'message-send-mail-with-sendmail)

;; Устанавливаем в качестве программы для отправки писем msmtp
(setq sendmail-program "/usr/bin/msmtp")
(setq message-sendmail-envelope-from 'header)

;; Сортируем письма по дате
(setq gnus-thread-sort-functions '(gnus-thread-sort-by-most-recent-date))

;; Добавляем автодополнение по TAB для поля To
(add-hook 'message-mode-hook
(function (lambda()
(local-set-key (kbd "<tab>") 'bbdb-complete-mail))))

;; Если адресса получателя нет в базе BBDB - добавляем
(add-hook 'message-setup-hook 'bbdb-mail-aliases)

;; Добавляем в базу контактов адресатов из входящей почты
(bbdb-initialize 'gnus 'message)
(bbdb-mua-auto-update-init 'gnus)
(setq bbdb-mua-auto-update-p 'create)

;; Говорим демону Gnus проверять новую почту каждые пять минут
(gnus-demon-add-handler 'gnus-demon-scan-news 5 t)
(gnus-demon-init)

;;; .gnus.el ends here


Все! Нажимаем `M-x RET gnus RET` и радуемся.

Так выглядит буфер с группами и непрочитанными сообщениями:

А так список сабжей в группе(синим цветом показаны прочитанные сообщения):

> Обновлять групповой буфер можно по g, а написать новое сообщение по m. Отправить набраное сообщение через C-c C-c. Ответ на сообщение с цитатой R, без - r.

Ссылка: https://difrex.lessmore.pw/post/gnus-multi-accounts/

[>] Ограничиваем в правах Firefox с помощью apparmor
difrex.blog
Difrex(tavern,23) — All
2018-11-27 09:45:36


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

© Wikipedia.org

Самое опасное приложение на десктопе, как я считаю, - это браузер. На меня напал очередной приступ паранои и я написал профиль apparmor для Firefox.

## tl;dr

Ставим утилиты:


pacman -S apparmor audit


Apparmor входит в ядро, так что нужно только его включить передав соответствующие параметры в cmdline Linux. Правим /etc/default/grub:


GRUB_CMDLINE_LINUX="apparmor=1 security=apparmor audit=1"


Включаем сервисы:


systemctl enable apparmor
systemctl enable auditd


Разрешаем себе читать audit.log


groupadd -r audit
gpasswd -a USERNAME audit


В /etc/audit/auditd.conf прописываем только что созданную группу: `log_group = audit`

Перезагружаемся

Проверяем статус apparmor:


apparmor_status
apparmor module is loaded.
62 profiles are loaded.
49 profiles are in enforce mode.
...
SKIP
...


Пишем профиль /etc/apparmor.d/usr.bin.firefox


#include <tunables/global>

/usr/bin/firefox {
#include <abstractions/base>
#include <abstractions/bash>

# Даем доступ к видео, памяти и tty
/dev/dri/** wr,
/dev/dri/ r,
/dev/shm/ r,
/dev/tty* rw,
/dev/shm/* rw,

# Даем доступ к конфигам, а так же сети и SSL
/etc/fonts/** r,
/etc/drirc r,
/etc/mime.types r,
/etc/pulse/client.conf r,
/etc/nsswitch.conf r,
/etc/ca-certificates/** r,
/etc/resolv.conf r,
/etc/host.conf r,
/etc/ssl/openssl.cnf r,
/etc/hosts r,
/etc/gai.conf r,
/etc/machine-id r,

# Разрешаем исполнение самого себя
# /usr/bin/bash ix,
/usr/bin/firefox rix,
/usr/bin/chrome-gnome-shell rix,
# Разрешаем грепать
/bin/grep ixr,

# Доступ к библиотека на чтение/подключение
/usr/lib/* rm,
/usr/lib/dri/* rm,
/usr/lib/python3.7/** rm,
/usr/lib/firefox/** rixm,

# Доступ к системным FS
/sys/devices/system/cpu/present r,
/proc/** r,
/sys/devices/** r,

/usr/share/hunspell/ r,
/usr/share/fonts/** rwkl,
/usr/share/sounds/** r,
# тут 1000 нужно заменить на id своего юзера
/run/user/1000/** r,

# Разрешаем писать во временную директорию
/tmp/** rwk,

# Даем права на чтение/запись/лок/линкинг
/run/user/1000/** rwkl,
# Разрешаем писать в сокет dbus
/var/run/dbus/system_bus_socket w,

# Шрифты/значки и.т.д
/var/cache/fontconfig/** r,
/var/lib/flatpak/exports/** r,
/usr/share/fonts/ r,
/usr/share/icons/** r,
/usr/share/glib-2.0/** r,
/usr/lib/firefox/** rwkix,
/usr/share/ca-certificates/** r,
/usr/lib/gtk-3.0/** rmk,
/usr/share/applications/kde4/ r,
/usr/share/pixmaps/ r,
/usr/share/icons/ r,
/usr/share/libthai/thbrk.tri r,
/usr/local/share/applications/ r,
/usr/local/share/applications/* r,
/usr/local/share/mime/mime.cache r,
/usr/share/applications/ r,
/usr/share/applications/* r,
/usr/share/gdm/applications/ r,
/usr/share/gdm/applications/* r,
/usr/share/locale-langpack/** r,
/usr/share/gtk-3.0/** r,
/usr/share/mime/** r,
/usr/share/myspell/** r,
/usr/share/themes/** r,

# Назначаем Firefox влядельцем ~/.mozilla и даем ему там все права
# кроме исполнения и подключения библиотек
owner @{HOME}/.mozilla/** rwkl,
@{HOME}/.cache/fontconfig/** r,
@{HOME}/.cache/mozilla/** rwk,
@{HOME}/.cache/thumbnails/** r,
@{HOME}/.config/dconf/* rkw,
@{HOME}/.fonts/ r,
@{HOME}/.local/share/icons/** r,
@{HOME}/.cache/mesa_shader_cache/index rwk,
@{HOME}/.local/lib/python3.7/** rm,
@{HOME}/.config/fcitx/dbus/* r,
@{HOME}/.local/share/recently-used.xbel rk,

# Определяем каталоги в домашней директории куда можно ходить
# Firefox и с какими правами.
# В моем случае браузер не может даже получить список
# каталогов, но может читать в разрешенных местах и писать в ~/Загрузки
@{HOME}/Изображения/ r,
@{HOME}/Документы/ r,
@{HOME}/Загрузки/ r,
@{HOME}/Видео/ r,
@{HOME}/Музыка/ r,
@{HOME}/soft/ r,
@{HOME}/Изображения/** r,
@{HOME}/Документы/** r,
@{HOME}/Музыка/** r,
@{HOME}/Загрузки/** rwk,
@{HOME}/Видео/** r,
@{HOME}/soft/** r,

# Кэши и локальные конфиги
@{HOME}/.local/share/fonts/ r,
@{HOME}/.fonts/** r,
@{HOME}/.ICEauthority r,
@{HOME}/.Xauthority r,
@{HOME}/.adobe/**/ r,
@{HOME}/.config/* r,
@{HOME}/.cache/* wrk,
@{HOME}/.config/gtk-2.0/* r,
@{HOME}/.config/gtk-3.0/* r,
@{HOME}/.fonts.conf r,
@{HOME}/.icons/ r,
@{HOME}/.local/share/applications/ r,
@{HOME}/.local/share/applications/* r,
@{HOME}/.local/share/fonts/** r,
@{HOME}/.local/share/icons/ r,
@{HOME}/.local/share/mime/mime.cache r,
@{HOME}/.pulse-cookie krw,
@{HOME}/.config/pulse/** krw,
}


PULL THE LEVER


aa-enforce /etc/apparmor.d/usr.bin.firefox
Назначение /etc/apparmor.d/usr.bin.firefox принудительного режима.


Теперь можно запустить браузер и проверить его работоспособность. Наблюдаем через `tail -f /var/log/audit/audit.log | grep DENIED` что было запрещенно Firefox.

Для меня, например, это:


type=AVC msg=audit(1543307263.804:81037): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/etc/passwd" pid=31159 comm="firefox" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307263.884:81039): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/lsb_release" pid=31177 comm="firefox" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0
type=AVC msg=audit(1543307263.991:81040): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/dev/" pid=31156 comm="firefox" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.698:81043): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/usr/bin/" pid=31493 comm="chrome-gnome-sh" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.944:81044): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/ldconfig" pid=31533 comm="chrome-gnome-sh" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.968:81045): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/gcc" pid=31534 comm="chrome-gnome-sh" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0


Зачем браузеру запускать компилятор я категорически не понимаю.

Смотрим еще раз в `apparmor_status`, в конце должно быть что-то подобное:


...
9 processes are in enforce mode.
/usr/lib/firefox/firefox (587) /usr/bin/firefox
/usr/lib/firefox/firefox (3857) /usr/bin/firefox
/usr/lib/firefox/firefox (31156) /usr/bin/firefox
/usr/lib/firefox/firefox (31212) /usr/bin/firefox
/usr/lib/firefox/firefox (31298) /usr/bin/firefox
/usr/bin/python3.7 (31491) /usr/bin/firefox
/usr/lib/firefox/firefox (31516) /usr/bin/firefox
/usr/bin/ntpd (1462) /usr/{bin,sbin}/{,open}ntpd
/usr/bin/dnsmasq (1510) dnsmasq


Все довольно просто в отличии от того же SELinux. А еще у apparmor есть очень хорошая документация с quick guide.

Ссылка: https://difrex.lessmore.pw/post/apparmor-firefox/

[>] Автоматический тайлинг в Sway
difrex.blog
Difrex(tavern,23) — All
2019-04-07 15:08:45


Я давно использую i3wm в работе, а после выхода версии 1.0 Sway я перешел на него с i3. Sway - это пракатически полностью совместимый с i3 композитор Wayland. По-этому перейти на него оказалось очень просто. Мои конфиги Sway можно посмотреть на Github.

Почему-то я долгое время думал, что мне в i3/sway не хватает полностью ручного тайлинга, я пробовал различные оконные менеджеры с ручным тайлингом, такие как, `bspwm`, `herbstlutfwm` и другие, но они не заходили. Потом я решил попробовать AwesomeWM, все-таки это по сути фреймворк и на Lua можно написать все, что угодно. В нем мне очень понравилась стандартная возможность автоматического тайлинга. Вот, что мне переодически нужно, подумал я. Но во всех WM, что я пробовал не было нормальной поддержки скретчпадов - это такие плавающие окна, которые большую часть времени скрыты, и показать их можно, например по комбинации клавишь. Что же мне на самом деле хотелось от WM - скретчпады, полуручной и автоматический тайлинг, возможность менять поведение скриптами на любом языке. По всем параметрам подходил Sway за исключением автоматического тайлинга. Было решено добавить его самостоятельно.

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

Так я решил написать(и написал) биндинг к Sway IPC на Go. И уже поверх этого начал писать демона, который реализует автоматический тайлинг.

На данный момент я реализовал `spiral` layout, который работает, так как я хочу и полностью меня устраивает. Так же на начальном этапе реализован `left` layout. Демонстрацию этих режимов можно посмотреть в видео ниже.

## Как этим воспользоваться?

Для начала нужно скомпилировать swaymgr. Из зависимостей только Go - поставь его из репозиториев твоего дистрибутива.


git clone https://github.com/Difrex/gosway
cd gosway/swaymgr
go get -t -v ./...
go build -o ~/.local/bin/swaymgr


Теперь можно добавить swaymgr в конфигурацию sway. Добавь следующие строчки в `~/.config/sway/config`


exec_always ~/.local/bin/swaymgr
bindsym $mod+Alt+m exec ~/.local/bin/swaymgr -s 'set manual'
bindsym $mod+Alt+l exec ~/.local/bin/swaymgr -s 'set left'
bindsym $mod+Alt+s exec ~/.local/bin/swaymgr -s 'set spiral'


Комбинации клавишь меняй по своему вкусу.

Swaymgr запоминает свою расскладку для каждого рабочего стола, а состояние хранит в `~/.autotiling.bolt`. В репозитории ты так же найдешь скрипт, который можно использовать, например, с `i3blocks`.

## Про внутреннее устройство

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

Swaymgr - это отлельное приложение, которое использует `gosway/ipc`.

Для того, чтобы взаимодействовать со Sway через unix-socket необходимо два подключения:

1. Соединение для передачи различных комманд
2. Соединение на которое будут приниматься события от оконного менеджера

Так же для хранения настроек рабочих столов используется встроенная, минималистичная база данных Bolt. Функция `newManager() (*manager, error)` создает все необходимые подключения и вызывает функцию инициализации интерфейсов `Layout`. Возвращаемая структура имеет такой вид:


type manager struct {
commandConn *ipc.SwayConnection
listenerConn *ipc.SwayConnection
store *store
layouts map[string]Layout
}


Главный интерфейс, с помощью которого реализуются все режимы - Layout, выглядит он так: Файл `swaymgr/layouts.go`


type Layout interface {
// PlaceWindow must receive an *ipc.Event
// and do the container manipulation
PlaceWindow(*ipc.Event) error
// Manage must store WorkspaceConfig in the database with
// the workspace name, layout name and with the Managed: true
Manage() error
}


У этого интерфейса есть всего два метода:

* `Manage() error` - вызывается тогда, когда текущий рабочий стол переключается в какой-либо режим
* `PlaceWindow(*ipc.Event) error` - вызывается тогда, когда создается новый контейнер на рабочем столе, который является управляемым.

### Как работает spiral layout

Я рассмотрю управлене окнами на примере реализации режима spiral.

Структура этого режима состоит всего из двух полей:

* `Conn *ipc.SwayConnection` - Коммандное подключение к unix-сокету Sway
* `store *store` - Открытое соединение к базе данных, в котой хранятся текущие настройки рабочих столов

При наступлении события создания нового окна, и если текущий рабочий стол управляется, данное событие передается в метод `PlaceWindow(event *ipc.Event)`. Для начала необходимо найти текущее окно на котором находится фокус:


nodes, err := s.Conn.GetFocusedWorkspaceWindows()
if err != nil {
return err
}
var result ipc.Node
for _, node := range nodes {
if node.Focused {
result = node
break
}
}


Далее вся логика позиционированния окон помещается в 7 строчек:


if result.WindowRect.Width > result.WindowRect.Height {
_, err := s.Conn.RunSwayCommand(fmt.Sprintf("[con_id=%d] split h", event.Container.ID))
return err
} else {
_, err := s.Conn.RunSwayCommand(fmt.Sprintf("[con_id=%d] split v", event.Container.ID))
return err
}


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

## Зарезервированные режимы

Я заранее зарезервировал некоторые режимы которые очень хочется реализовать. Вот они:

* `type FiberLayout struct{}` - режим подсмотренный в AwesomeWM. Окна размещаются симметрично друг под другом и вдоль
* `type TopLayout struct{}` - самое большое окно размещается вверху экрана, остальные внизу разделяясь по горизонтали
* `type BottomLayout struct{}` - тоже самое, что и для TopLayout, но главное окно находится внизу
* `type RightLayout struct{}` - тоже самое, что и LeftLayout, но главное окно размещается справа

Проект на Github. Учитывай, что это пока самая ранняя реализация и тут могут быть баги в больших колличествах, правда ничего критичного я пока не находил - пользоваться можно. Буду очень рад баг-репортам и фич-реквестам, а так же особенно пулл-реквестам. Лицензия проекта: Apache.

Ссылка: https://difrex.lessmore.pw/post/sway-autotiling/

[>] Re: Что с станцией lessmore?
idec.talks
Difrex(dynamic,1) — hugeping
2020-09-14 22:14:25


Пофиксил, фетчу тебя :)

[>] Re: no-https-services
idec.talks
Difrex(dynamic,1) — oldpc
2020-10-18 08:34:21


Документация нет доступной без https, но есть в гите.

Еще Таверна по http работает http://idec.spline-online.tk/

[>] Re: no-https-services
idec.talks
Difrex(dynamic,1) — oldpc
2020-10-19 08:38:31


Вот еще по http зеркало dynamic http://ideclubzduruedpzzrxxbt2hk6apecuhni5vnjlsqg2t3gdet26fjyid.onion/ но в TOR :)

А вот на Таверну залил документацию http://idec.spline-online.tk/s/download/idec/docs.tar.gz из master гита

[>] Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
Difrex(dynamic,1) — Andrew Lobanov
2020-10-22 10:17:25


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

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

[>] Re: Plan 9: экстремальный KISS #1
std.hugeping
Difrex(dynamic,1) — btimofeev
2020-10-28 14:15:04


> Шелл конечно аскетичный, надоедает каждый раз вводить команду заново
Кстати, а нет ли порта bash под plan9?

[>] Re: Механические клавиатуры
pipe.2032
Difrex(dynamic,1) — btimofeev
2020-11-09 07:53:51


Итак, с апреля месяца сижу на механике - офигенно, понравилось!

Немного про ощущения от qcyber dominator tkl после более чем полугода использования. По более чем 8 часов в день.

* Клава шумная, но шумят не свичи, а кейкапы об металлическую панель.
* Space, return, backspace песочат. Пробел гремит. Орингами ситуация с пробелом немного исправляется, но совсем чуть-чуть.
* Скелетон выглядит круто только первое время - потом уже не кажется таким крутым.
* Сборка качественная, до сих пор ничего не скрипит и не разваливается.
* Кейкапы хорошие - двойная печать. Ничего не потерлось.
* Слепая печать улучшилась :)
* ISO enter отстой - до него дольше тянуться, чем на ANSI расскладке.

В целом клава неплохая и за свои деньги это точно нормальный вариант. Но нужно быть готовым к тому, что она шумит. Клоны свичей cherry red качественные. Разницы между ими и оригиналами не почуствовал.

За это время понял, что хочеться тактильных свичей. Заказал себе Anne Pro 2 на Kailh Box Brown. Эти свичи еще и водонепроницаемые.

Теперь не хочу возвращаться на мембранку :)

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

[>] Re: Механические клавиатуры
pipe.2032
Difrex(dynamic,1) — hugeping
2020-11-10 06:47:43


> но если выбираете между красными и синими/коричневыми
Поздно, уже едет посылка из китая с коричневыми свичами :)

[>] Re: Механические клавиатуры
pipe.2032
Difrex(dynamic,1) — btimofeev
2020-11-10 06:54:56


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

// Сам я, конечно, не проверял звук саморезов, но предполагаю, что это похоже должно быть

[>] Re: Механические клавиатуры
pipe.2032
Difrex(dynamic,1) — btimofeev
2020-11-10 14:36:53


> Ещё резиновые колечки продают для смягчения, кто-то пробовал?
Я на пробел такие штуки поставил - взял у коллеги. Звук стал глуше, лязгает меньше.
Вместе с anne придут и оринги, планирую сразу поставить на все клавиши.

[>] Re: Artist-mode в Emacs
pipe.2032
Difrex(dynamic,1) — Andrew Lobanov
2020-12-28 13:51:09


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

Использую artist-mode по работе - все норм. Но я рисую в *scratch*, а потом копипастю в нужный мне буфер.

[>] Re: Artist-mode в Emacs
pipe.2032
Difrex(dynamic,1) — Andrew Lobanov
2020-12-29 08:15:55


А так, вроде, все просто там https://cloud.lessmore.pw/index.php/s/rkYMDEzwZXm7S7E

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

[>] dynamic.lessmore.pw deprecated
idec.talks
Difrex(dynamic,1) — All
2021-04-01 13:20:43


Да здравствует static.lessmore.pw!

На самом деле я не справился с javascript, точнее с его экосистемой. Это не язык плохой, а я ленивый, если что. Мне больше нравится когда я могу пол года не обновлять свой код, а потом
когда опять будет всплеск энтузиазма к какому-то проекту, то обновить я все смогу легко и ничего не поломается. Это я про Go сейчас.
Ну и приятнее мне все же писать на Go, а не typescript :). Опять же на работе у меня таких проблем нет, т.к. все проекты, в которые я коммичу, довольно акутальные и там обновляется все нормально.

Так вот!

== Что будет с нодой dynamic.lessmore.pw

* Репозиторий на github/gitea будет отправлен в архив
* Веб-интерфейс какое-то время еще будет доступен, потом будет сделано перенаправление на static.lessmore.pw
* Нода продолжит работать по прежнему url https://dynamic.lessmore.pw/idec/
* Прямой доступ к API поиска elasticsearch будет закрыт
* Фетчинг всего со всего из list.txt продолжится. dynamic останется главным источником для фетча для static
* UI будет трансформирован в поисковую систему, как уже когда-то было, но под другим именем и с нормальными фичами, типа автодополнения. Будет объявлено позже.

== А что со static.lessmore.pw?

Нода:

* Строка для подключения клиентом https://static.lessmore.pw/
* В бэкенде по прежнему Elasticsearch
* Фетчатся только некоторые эхи. В данный момент это:
* pipe.2032
* idec.talks
* linux.14
* develop.16
* std.club
* std.hugeping
* game.rogue.14
* difrex.blog
* music.14
* plan.9

Веб:

* Новый полностью статический SSR интерфейс доступен по https://static.lessmore.pw
* В процессе написания интерфейса на шаблонах Go получилось что-то типа микрофреймворка с переиспользуемыми компонентами - прикольно :)
* Основная ориентация по тредам по времени. Будет возможность смотреть треды без привязки ко времени, а по колличеству на страницу, как везде, но потом
* Т.к. я фетчил не все, то в веб-интерфейсе не видны все треды - есть сообщения без топ-поста. Но они доступны в IDEC API и все новые треды будут отображаться нормально.

== Поиск

На static теперь есть полностью работающий поиск!

Можно искать просто "linux". А можно сделать что-то поинтреснее, типа

message:"Поставил в qemu 9front" AND author:"hugeping"

то будет искаться только фраза целиком в сообщении от @hugeping. Для простого поиска по любому из слов - просто воткните их туда через пробел.
Ну и в кавычках можно искать по всему по любой фразе. Важно: слова должны боть полными и без опечаток. т.е. "жопа" найдется, а вот "жипа" уже нет - это штука не такая умная, как яндекс :)
А в целом там синтакс Lucene, так что, можно конструировать довольно сложные запросы.

Исходники в скором времени будут выложены - это все та же самая нода.
Постинг с регистрацией тоже в скором времени прикручу.

Ах да. Пока что интерфейс абсолютно не оптимизирован для мобилок. Так-то на мобилках есть IDEC Mobile, но работу на мобилках я тоже сделаю ^_^.

Пишите про баги.

[>] Re: Механические клавиатуры
pipe.2032
Difrex(dynamic,1) — btimofeev
2021-05-02 13:16:45


> 1. Официальная программа для линукса почему-то перестала перепрошивать клаву, при попытке прошить программа наглухо зависает. Последнюю прошивку ставил из винды. Не исключено, что в будущем придется перейти на кастомную прошивку openannepro.github.io (но это хорошо что подобная хотя бы есть).

Странно, но у себя ничего подобного не замечал - прога работает нормально.

> 2. Месяца два назад начал замечать, что кнопка V иногда дает двойные нажатия

У меня есть подобная проблема с \. И почему-то проявляется только при легких нажатиях - когда жмешь быстро и до конца, то такого нет. Проблема это с самого начала присутствует. С остальными клавишами все ок. В принципе можно заменить свитч.

[>] Re: Новая работа
pipe.2032
Difrex(dynamic,1) — Andrew Lobanov
2021-06-01 09:22:53


Поздравляю!
В какой город переезжаешь? Что с нодой будет? :)

> Единственная проблема в том, что ребята не пишут документацию. Совсем. Как с этим бороться снизу? Есть истории успеха?
Начини сам писать документацию для своего проекта и добавь сборку оной в ваш CI. Я принес во все наши большие проекты sphinx.
Для некоторых проектов можно собирать документацию из docstring - это для документирования API. А для мелких часто хватает небольшого README.md в корне.

[>] Re: Новая работа
pipe.2032
Difrex(dynamic,1) — vvs
2021-06-01 12:57:33


> Комментарии и API - это другое дело.
Нет, не другое. Смотря какую документацию мы имеем в виду и что пишем. Если у тебя библиотека, которой будут пользоваться многие, то очевидно, что нужно документировать API(вместе с примерами).

[>] Re: Новая работа
pipe.2032
Difrex(dynamic,1) — vvs
2021-06-01 14:26:33


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

[>] Re: Новая работа
pipe.2032
Difrex(dynamic,1) — Andrew Lobanov
2021-06-15 13:43:13


> Переезжаю в Питер, хотя сроки опять сдвигаются. Нода переедет на арендованный сервер из под дивана :)
Люблю Питер, очень атмосферный город. Следующий в списке на переезд после Минска :). Надо будет пересечься сеткой в Питере :)

[>] Re: Точка Z
std.hugeping
Difrex(dynamic,1) — hugeping
2022-04-11 17:22:43


Кто-то убегает в другие страны подальше от РФ, а я наоборот возвращаюсь.

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

+++ картошки хватит на всех

[>] Re: dumb
plan.9
Difrex(dynamic,1) — nvkv
2021-08-25 15:28:22


О, эта штука может пригодиться на очередном CTF :)

[>] Re: боны поны и прочее
develop.16
Difrex(dynamic,1) — iiii
2023-01-19 22:13:44


Не вижу смысла в новой эхе. Но, на пример, динамик фетчит все из list.txt. Так что новая эха у меня на ноде появится.

ЗЫ: хочу тянуть по 9000 сообщений

[>] Re: боны поны и прочее
idec.talks
Difrex(dynamic,1) — ii.51t.ru
2023-01-21 10:32:27


> нифига не понял, почему это в develop

Да это мой косяк. Постил из браузера - он эху не ту подставил. Главное, что тред один и тот же и msgid не потерялись.

[>] Re: GTK5 и Xorg
linux.14
Difrex(dynamic,1) — Andrew Lobanov
2023-01-21 10:37:08


По мне так Wayland давно готов(для меня). Из приложений только я.браузер через xwayland работает. Даже Emacs можно собрать с чистым gtk и он будет нативно в Wayland работать :)

Pages: 1 ... 4 5 6 7 8 9 10 11 12 13 14