Loess.ru

having fun

Some ways for organizing linux desktops/workflows/terminals

Прекрасная статья-обзор организации процесса в текстовых терминалах в терминальной стадии: http://jacobzelko.com/workflow/ (pdf)


Таскбар в screen делается записью в ~/.screenrc, что-то типа:
hardstatus alwayslastline "%{bw}[%H] [%?%-Lw%?%{wb}%n*%f %t%{bw}%?%+Lw%?]%=%{bw} [%1`] [%c:%s] [%l]"
http://www.softpanorama.org/Utilities/Screen/tips.shtml
https://www.transfusion.eu.org/2014/06/18/gnu-screen-on-steroids/


Недавно узнал, что window-менеджеров не десять штук, а в разы больше =) Например, HiveOS использует легковесный аскетичный Openbox WM + Tint2:


https://laurvas.ru/openbox/

Git для самых маленьких и для совсем больших

https://ohmygit.org/

Git LFS vs Git Annex:

side-to-side comparison: https://workingconcept.com/blog/git-annex-vs-git-lfs (pdf)
вводный обзор, как работать с annex: https://blog.debiania.in.ua/posts/2013-12-15-advertising-git-annex.html (pdf)

Основное юзабилити-отличие:

With Git LFS, new developers cloning a Git LFS-enabled repo for the first time don’t need to know anything about it. They can use «git lfs clone» to have that initial clone come down faster, but they don’t have to. «git clone» alone is all they need.

Based on my reading just now (mainly Git Annex vs. Git LFS), with Git Annex new developers cloning the repo for the first time must also remember to invoke «git annex sync —content» after cloning. They must also remember to run that same command after adding new files.

While it probably does not seem like a lot to remember (one extra command to type), in my experience adding one extra command to a workflow can impair productivity pretty signficantly — especially if people sometimes forget to run that command.

— https://www.reddit.com/r/git/comments/7vgudg/why_or_is_git_lfs_winning/

Backing up Mikrotik RouterOS config to Git repository

#!/bin/sh
cd /home/user/
/usr/bin/ssh -i /home/user/.ssh/id_rsa admin-ssh-account@ip.address.of.mikrot "export" > /home/user/mikrot-config/mikrot.conf 2>&1
#deletes first line with datetime for committing only config changes
/bin/sed -i '1{/by RouterOS 6/d;}' /home/user/mikrot-config/mikrot.conf
git add ./mikrot.conf
git commit -m "backup as of $(/bin/date +\%Y-\%m-\%d-\%H-\%M-\%S)"

if you need to backup a lot of hosts and webface for backup control, check https://www.ekzorchik.ru/2019/03/backing-up-mikrotik-via-oxidized/ (pdf)

Git clone branch from one remote to another by webhook call

quick and (very) dirty:

1.

git clone repo.git
cd repo
git status
git remote -v
git remote set-url --push origin git@github.com:User/repo.git

this should set your remote.origin.pushurl to another path, check it with

git remote -v

2. check it with

git pull origin master && git push

3. make sure you set your private and public ssh keys for pulling and pushing seamlessly

4. write bash script for this, for example:

cd /home/lol/repo/
echo $(date +%Y-%m-%d-%H:%M) >> /home/lol/copy-repo.log
git pull origin master >> /home/lol/copy-repo.log 2>&1
git push >> /home/lol/copy-repo.log 2>&1

You can skip and do this directly from within Python flask server with https://gitpython.readthedocs.io/en/stable/tutorial.html

5. Set up webhook @ first webservice to call @ push event. Write flask-server for getting webhooks, open incoming port, for example:

from flask import Flask
from flask import request
from bitbucket_webhooks import event_schemas
from bitbucket_webhooks import hooks
from bitbucket_webhooks import router
import subprocess

app = Flask(__name__)

@app.route("/hooks", methods=["POST"])
def bb_webhooks_handler():
    router.route(request.headers["X-Event-Key"], request.json)
    return ("", 204)

@hooks.repo_push
def _handle_repo_push(event: event_schemas.RepoPush):
    print(f"One or more commits pushed to: {event.repository.name}")
    subprocess.call("/home/lol/copy-repo.sh")

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=617, debug=False)

or if you prefer bash+netcat-like way, consider trying this https://gist.github.com/orangeblock/15ee8e3cb304a4046082b422adaaf5fb

6. wrap it into waitress call (i don’t know why but flask says it sufficient 😀 ):

if __name__ == '__main__':
    from waitress import serve
    serve(app,host="0.0.0.0",port=617)

7. wrap it into Systemd unit (https://blog.miguelgrinberg.com/post/running-a-flask-application-as-a-service-with-systemd):

[Unit]
Description=Webhook monitor for copying repo from BB to GitHub
After=network.target

[Service]
User=lol
WorkingDirectory=/home/lol
ExecStart=/usr/bin/python3 /home/lol/clone-repo-webhook-server.py
Restart=always

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start clone-repo-webhook-server
systemctl enable clone-repo-webhook-server

p.s. and you could combine this with git full-mirroring capabilities as you like
p.s. heres bb man https://support.atlassian.com/bitbucket-cloud/docs/create-and-trigger-a-webhook-tutorial/ and webhook listener repo https://bitbucket.org/atlassianlabs/webhook-listener which I haven’t read

FreeCad quick intro

SVG to FreeCAD:

quickest intro ever:

И ещё немножко мануалов по сборке сложных деталей:
https://wiki.freecadweb.org/Sketcher_Workbench


Канал с примерами:
https://www.youtube.com/channel/UC5nqtWv3094XLubtxzvK8zg

Current stable version 18.4 содержит неприятнейшую особенность — https://wiki.freecadweb.org/Topological_naming_problem

В последней 19 версии — она не исправлена, (хоть и неоднократно обещали), посему можно пользоваться продвинутым няшным форком:
https://github.com/realthunder/FreeCAD_assembly3/releases

Вот такую красоту (Himoto hi823402) можно сделать с нуля за пару вечеров:

Дичайшие спойлеры на Satisfactory и другие factory/sandbox-гриндилки

I Built a 600 Meter Human Cannon That Ends All Existence — Satisfactory

I built Stargate Atlantis and ALL the turbo motors (156/min) in Satisfactory Showcase 3

100% MAXED OUT FACTORY! — Satisfactory Mega Base Tour

Спойлер на Astroneer: После просмотра играть не захочется!
I Set Off So Much Dynamite It Ended Reality in Astroneer

Спойлер на Hydroneer:
I Shoplifted My Way to Another Million Dollars in Hydroneer

Media-insatiability: some aspects of presence of social-media in our lives

1) Centralization of everything, diversity reduction

It is your moral obligation to use Firefox
https://0x46.net/thoughts/2019/04/09/use-firefox/

https://nomoregoogle.com/

https://killedbygoogle.com/

2) Behavior modifying

Андрей Курпатов. Гаджеты делают нас глупее, несчастнее и гробят наших детей?

3) Personal data gathering by default,

Как удалить «неудаляемые» приложения со смартфона
https://habr.com/ru/company/vdsina/blog/528550/

4) and following — Totalitarism

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

Я спрашивал, что происходит и почему задержан. Полицейский подтвердил, что меня нашли по камерам поиска, что сейчас будут проверять, участвовал ли я в митинге 23 января.На входе в ОВД Тверское уже сидели несколько задержанных, по разговорам которых я понял, что их тоже задержали по поиску камер на входе в метро.

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

Для распознавания лиц московские власти используют разработки трёх разных компаний но основа — алгоритм FaceN для определения лица в кадре от компании NTech Lab, создавшей сервис FindFace для поиска людей во «ВКонтакте» по одному снимку.

«Мне как обычному человеку важнее безопасность, чем приватность», — говорит Кухаренко.
В полиции тоже довольны приложением. «Если такая программа будет внедрена в телефоны сотрудников полиции, и не только полиции, то это поможет на месте определять, что за человек и кого они остановили»

https://tjournal.ru/tech/333457-sistema-raspoznavaniya-lic-v-moskve-teper-ishchet-protestuyushchih-kak-ona-ustroena-i-chto-sdelat-dlya-zashchity (pdf)

https://meduza.io/feature/2016/07/07/konets-chastnoy-zhizni (pdf)

Git tools: diff docx/pdf, git server

Using git diff for doc, xls, pdf, ppt, odt:

https://gist.github.com/mbrehin/634f46aeacb0a9a6da5e (pdf)
for docx use pandoc as following (https://blog.martinfenner.org/posts/using-microsoft-word-with-git):

[diff "docx"]
textconv=pandoc --to=markdown
prompt = false

Git personal server

(Gitolite, Cgit, fcgiwrap, and Nginx)

https://bryanbrattlof.com/cgit-nginx-gitolite-a-personal-git-server/ (pdf)

and more of freshly-baked gitlab alternatives: https://www.cyberciti.biz/open-source/github-alternatives-open-source-seflt-hosted/

Правило 20 секунд

Здесь было видео «Use Laziness To Your Advantage — The 20 Second Rule», но «Видео недоступно, Автор ограничил доступ к видео.», поэтому теперь версия на русском:

Кратко: Избавляйтесь от плохих привычек, делая их на 20 секунд сложнее, и приобретайте хорошие — делая их на 20 секунд проще
(от себя: и закрепляя их в течение ~40 дней)

Открыт путь к одному из центров удовольствия

пример 1: «ломание ожидания игрока в процессе рутинного действия»

пример 2: звуки, которых нет

пример 3: ломание ожиданий от знакомых мотивов
Когда мотив началом очень похож на что-то очень давно и сильно засевшее в мозгу, типа первых трёх нот «лунной сонаты», но тут же ломается:

пример 4: ломаный бит, ломаный темп, ломаный ритм, тишина в моменты кульминации — тысячи их

назови примеры из жизни сам =)

Причём, удовольствие работает в обе стороны: и когда контент противодействует привычным «нейронные путям» (создание новых связей), и когда контента «нет» — задействуются «широкие» сложившиеся связи. Судя по всему, в процессе обучения происходит что-то похожее: когда связываются воедино несколько, на первый взгляд, разрозненных вещей — происходит «Aha moment«, равно как в аналогию примеру №2 можно привести удовольствие от созидания, создания чего-то нового.

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