Things that live here:

  1. Work log, where I note things I feel I'll have to Google later.
  2. Journal, very similar but about non-IT topics.
  3. Blog for rare longer-form posts (last one below).

Feel free to look at what you can find here and enjoy yourself.


~17% of my country is occupied by Russia, and horrible things are happening there. You can help stop this! If you can donate - I contribute to (and fully trust) Come Back Alive and Hospitallers, but there are also other ways to help.


Latest posts from the Work log

Day 2101

GPT4 is much better than gpt 4o

As of 2024-10-02 20:16 at least.

give me the ag command to look inside markdown and yaml files only

GPT4o1:

`ag --include='*.md' --include='*.yaml' --include='*.yml' 'search_pattern'`

GPT42:

`ag "search_pattern" --markdown --yaml`

Git ignoring files local-only without gitignore

TIL1:

  • ./git/info/exclude is your local .gitignore outside the repository tree!
  • git update-index --assume-unchanged .gitignore makes git stop checking the changes for that file in the working tree. --no-assume-unchanged to take it back.23

Finally a place for my local ignores that won’t appear in autocomplete suggestions for git add and friends. In Pycharm I have changelists, and now I finally have a solution for my just-as-usual vim/git/CLI workflow as well.

BUT:

  • exclude won’t work if the file is already tracked (says SO but for me it works?..)

Day 2100

yay don't ask for confirmation + the `yes` command to answer prompts

Wanted to do sth like this all the time, but the help basically told me to copypaste multiple arguments etc.

Will come back to bite me but nice to have the option I guess

Question: How can I install packages without having to confirm? · Issue #1033 · Jguer/yay:

echo y | LANG=C yay --noprovides --answerdiff None --answerclean None --mflags "--noconfirm" $PKGNAME

(--noconfirm is not documented in help and man, and of course can create problems1)

BUT ALSO

yes is a command that exists.

Then: yes | yay ... or yes | LANG=C yay

And generally really neat to have a command for answering “yes” to prompts.

And then quick unsafe bad dangerous command to update everything that includes 241001-1512 Yay better compression algos:

echo y | LANG=C PKGEXT='.pkg.tar'  yay  --answerdiff None --answerclean None --mflags "--noconfirm"

Yay better/faster compression algos

yay took forever to compress pycharm. Like, 5-10 mins at least.

TODO documentation, but if you don’t care about package size but care about speed, this will speed up everything considerably:

PKGEXT='.pkg.tar' yay -S pycharm-professional

git-sizer analyses local git repos for problems

github/git-sizer: Compute various size metrics for a Git repository, flagging those that might cause problems (linked by Repository limitations and recommendations)

TL;DR too many files? too large one? too many tags? Find out!

Day 2099 / Google My Maps for shared maps

  • You can share lists in Google Maps, making them editable by everyone with a google account
  • Google My Maps is much cooler, with layers etc

Google My Maps

  • Really nice tutorial on everything: Visualize your data on a custom map using Google My Maps – Google Earth Outreach
  • To share it editable, you share -> Share on Drive
  • drag and drop doesn’t always work
  • style and colors
    • layer can be styled uniformly (easy)
    • style by data column: per-field, e.g. description, like a groupby
    • individual styles per element
  • you can drag and drop items between layers only if they’re styled individually??
  • If you style by e.g. description, assign icons/colors, then style individually to move them, then back to style by description, it seems to save the previous settings

Day 2093

VTK and ITK etc

So Slicer seems to use both and I need to as well, so I’ll have to learn that sooner or later.

Setting up pylint as external tool in pycharm

My changes:

  • arguments: --msg-template="{abspath}:{line:5d},{column:2d}: {C}/{msg} ({symbol})" --output-format=colorized "$FilePath$"
    • note ", otherwise it failed for me, and {C} — for the message class see man page (or below) for list of format string options.
  • output filters for on-click: $FILE_PATH$:\s*$LINE$\,\s*$COLUMN$

I had two options as separate tools:

  • pylint for a single file
  • pylint for the module — same as above, but
    • with $FileParentDir$ at the end.
    • --recursive=y — fails on no __init__.py otherwise

Worked neatly with a .pylintrc file in repo root with e.g.

[tool.pylint.main]

[tool.pylint.basic]
# "too-few-public-methods", disable
min-public-methods=0

function-naming-style="camelCase"
argument-naming-style="camelCase"
method-naming-style="camelCase"
variable-naming-style="camelCase"
attr-naming-style="camelCase"

[tool.pylint."messages control"]
disable = [
    "fixme",  # TODOs
    "import-error",  # runner has them in its environment
    "import-outside-toplevel",  # explicit requirement of XXX to import where used
    "duplicate-code"  # entangling different extensions/modules is not the solution
]

Pylint format string options from man pylint:

path   relative path to the file

abspath
	  absolute path to the file

line   line number

column column number

end_line
	  line number of the end of the node

end_column
	  column number of the end of the node

module module name

obj    object within the module (if any)

msg    text of the message

msg_id the message code (eg. I0011)

symbol symbolic name of the message (eg. locally-disabled)

C      one letter indication of the message category

category
	  fullname of the message category

For example, the former (pre 1.0) default format can be obtained with:

  pylint --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}'

Bonus

If I have this post open, I’ll need this one anyway: Messages control - Pylint 4.0.0-dev0 documentation

mypy notes

[mypy-mycode.package.etc]
disable_error_code = attr-defined, union-attr

Black unstable features

In pycharm, updated black to use these args: --preview --enable-unstable-feature string_processing $FilePath$

The (future of the) Black code style - Black 24.8.0 documentation has both the preview style and the unstable features one can enable (by passing the flag multilple times).

string_processing breaks long strings into multiple shorter ones, one on each line.

Day 2089 / File is not reserved in python anymore

Is ‘file’ a keyword in python? - Stack Overflow

TL;DR python3 doesn’t care about file, regardless of what syntax highlighters think about this.

Day 2082 / flake8 and docstrings

TL;DR:


pydocstyle / python-flake8-docstrings is a thing. Forgot I had it installed and spent a lot of time trying to understand pycharm’s output

Usage — pydocstyle 0.0.0.dev0 documentation flake8-docstrings · PyPI

To ignore things, you don’t do:

[pydocstyle]
convention = google
ignore = D401

It’s either ignore or convention. Which quietly happened in the background, and I thought it doesn’t read my config file since D401 was still shown.

Correct would be this:

[pydocstyle]
convention = google
add-ignore = D401

EDIT GodDAMN it, pydocsyle parsing a config file doesn’t mean that flake8(-..docstring) will.

Reading the flake8 plugin docs, I should add THIS and to flake8 config file. Ignores also are set up there using the usual way.

docstring-convention=google

And the pydoctest config file search and add-ignore is irrelevant. God lost so much time to this

Day 2079 / 3D Slicer reloading a scriptedCLI module

EDIT: this may be all wrong, in the debugger I can just edit the code and it gets automatically used by slicer — logical, since it’s just a CLI script.

It’s the .xml with the interface that’s problematic and it can’t be reloaded using the method below, or at least I couldn’t.


A scriptedcli module imported to Slicer doesn’t show for me the usual “reload” buttons as seen in scripted modules in dev. mode. To develop, I need my changes I need to reload it w/o restarting 3dslicer.

Based on this more complete example1 linked in the script repository2

>>> mpath = "/full/path/to/the/my_module.py"
>>> factoryManager = slicer.app.moduleManager().factoryManager()
>>> factoryManager.registerModule(qt.QFileInfo(mpath))
>>> factoryManager.loadModules(["my_module"])
True

BONUS:

  • To debug such a module using pycharm, adding the pydev lines inside it works (and official slicer debug extension doesn’t):
import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=5678, stdoutToServer=True, stderrToServer=True)

Day 2074 / Developing a 3D Slicer extension

Debugging

TL;DR Pycharm Professional instructions work

not TL;DR

Basics

Starting Slicer

Loads the module automatically (for some reason doing it manually doesn’t preserve it across restarts?..)

Slicer  --additional-module-path /path/to/my/extension/one/lower/than/what/i/would/pick/in/Slicer/GUI

Logging

  • Not directly mentioned in the help because they state it’s always better to use the debugger2
  • Slicer/Base/Python/slicer/slicerqt.py at main · Slicer/Slicer has the slicer setup
  • I can do logging.warning("test") in the python console and it works
  • Slicer settings allow changing the loglevel of its python console!

Module types: CLI modules

Different types of modules exist: Module Overview — 3D Slicer documentation

In the first tests there was a lot of latency.

Solution: CLI modules (not extensions) that can run in the background and whose status can be queried, which can be added to new extension from extension editor.

Now I understad this better:

  • CLI modules are simple I/O, non-blocking, that’s where the networkig logic should go to
  • scripted are python scripts with GUIs

Looking into the sample code

Module of type scripted

Module of type scriptedCLI

  • I hope it’s the same as type CLI, but only with python

  • I think it’s lassoan/SlicerPythonCLIExample: Example extension for 3D Slicer that demonstrates how to make a Python script available as a CLI module

  • Is a CLI script w/ an XML that has module metadata + examples

    • CLI module goes in the same examles menu
    • and a basic UI has been generated for it? Wow
    • Running it from the UI actually shows a progress bar and it doesn’t block the interface! Woohoo!
  • Adding it added it to CMakeLists.xml: add_subdirectory(my_scripted_cli)

  • python dev tools actually show the CLI used to run a CLI module!

    • the input arguments are filepaths, and slicer automatically generates and then deletes temporary files for this when running
  • can’t debug it the usual way, I guess I’ll have to add the pydevd-pycharm things to the code

[VTK] /opt/3dslicer/bin/python-real /home/.../cli_model_service.py /tmp/Slicer-sh/IACHCI_vtkMRMLScalarVolumeNodeD.nrrd 1 /tmp/Slicer-sh/IACHCI_vtkMRMLScalarVolumeNodeF.nrrd 

(Auto-creating) GUI

Auto-loading the module at startup

Module from console with arguments - Support - 3D Slicer Community

Slicer.exe --python-code "selectModule('SampleData'); getModuleGui('SampleData').setCategoryVisible('BuiltIn', False)"

File operations

Script repository — 3D Slicer documentation:

# Create a new directory where the scene will be saved into
import time
sceneSaveDirectory = slicer.app.temporaryPath + "/saved-scene-" + time.strftime("%Y%m%d-%H%M%S")
if not os.access(sceneSaveDirectory, os.F_OK):
  os.makedirs(sceneSaveDirectory)

Inspiration

Useful bits from documentation

Day 2066 / 3dslicer extension deployment options

Slicer --help:

  --testing                                     Activate testing mode. It implies --disable-settings and --ignore-slicerrc. (default: false)
  --disable-python                              Disable python support. This is equivalent to build the application with Slicer_USE_PYTHONQT=OFF.
  --python-script                               Python script to execute after slicer loads.
  --python-code                                 Python code to execute after slicer loads.
  -c                                            Python code to execute after slicer loads. By default, no modules are loaded and Slicer exits afterward.
  --ignore-slicerrc                             Do not load the Slicer resource file (~/.slicerrc.py).
  --additional-module-path                      Additional module path to consider when searching for modules to load.
  --additional-module-paths                     List of additional module path to consider when searching for modules to load.

Day 2044 / rsync on file changes with inotifywatch

inotifywait(1) - Linux man page

#!/bin/sh
while inotifywait --format '%:e %f' p.* *.bib; do
  sleep 1  # files get moved often
  echo "rsync!"
  rsync -avzirh --progress  p.* *.bib me@server.net:dir
done

Latest post from Blog

'The Hacker Manifesto', переклад українською

Оригінал: .:: Phrack Magazine ::.
Контекст: Маніфест хакера — Вікіпедія / Hacker Manifesto - Wikipedia
Існуючий дуже класний переклад, не відкривав, поки не закінчив свій: Маніфест хакера | Hacker’s Manifesto | webKnjaZ: be a LifeHacker

                               ==Phrack Inc.==

                    Том I, випуск 7, Ph-айл[0] 3 з 10

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Наступне було написано невдовзі після мого арешту...

	                        \/\Совість хакера/\/

	                               автор:

	                          +++The Mentor+++

	                           8 січня 1986р.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

	Сьогодні ще одного спіймали, пишуть у всіх газетах. "Кібер-скандал:
підлітку повідомили про підозру", "Кіберзлочинця затримали після
проникнення в систему банку".
	Тупа школота[1], вони всі однакові.

	Та чи ви, з вашою трафаретною ментальністю[2] та знаннями 
інформатики зразка першої половини пʼятидесятих[3], коли-небудь дивилися 
в душу хакера?[4] Чи вас колись цікавило, що є причиною його поведінки[5], 
які сили на нього впливали, що його сформувало?
	Я хакер, ласкаво прошу у мій світ...
	Мій світ почався ще зі школи... Я розумніший за більшість інших
дітей, і дурниці, які нам викладають, мені набридають.
	Тупий відстаючий[6], вони всі однакові.

	Восьмий, девʼятий, десятий, одинадцятий клас[7]. В пʼятнадцятий
раз слухаю, як вчителька пояснює, як скорочувати дроби. Мені все ясно. "Ні, 
Вікторія Миколаївна[8], я не написав проміжні кроки, я розвʼязав все усно..."
	Тупий підліток. Мабуть списав. Всі вони такі.

	Сьогодні я зробив відкриття. Я знайшов компʼютер. Ха, почекай-но,
це круто. Він робить те, що я від нього хочу. І якщо він помиляється,
це тому, що помилився я. А не тому що він мене не любить...
                         Або відчуває від мене загрозу...
                         Або думає що я тіпа самий умний[9]...
                         Або не любить викладати[10] і йому тут не місце...
	Тупий підліток. Він постійно тільки грає в свої ігри. Всі вони такі...

	Потім це відбулось... відчинились двері в світ... несучись телефонною 
лінією як героїн венами наркомана, надсилається електронний пульс,
шукається спасіння від невігластва навколо...[11] Знаходиться борд.[12]
	"Це воно... це те, до чого я належу..."
	Я з усіма тут знайомий... попри те, що я з ними ніколи не 
зустрічався, не розмовляв, і колись можливо більше нічого не чутиму про 
них... Я їх всіх знаю...
	Тупий підліток. Знову займає телефонну лінію... Вони всі однакові.

	Та можете не сумніватись,[13] що ми всі однакові... Нас годували
дитячими сумішами з ложки, коли ми хотіли стейк... а ті куски мʼяса, які 
до нас все ж потрапляли, були вже пережовані і без смаку. Над нами
панували садисти, або нас ігнорували байдужі. Для тих, хто хотіли чомусь 
нас навчити, ми були вдячними учнями, але їх було як краплин дощу в
пустелі.

	Цей світ зараз наш... світ електрона і комутатора, світ краси
бода[14]. Ми користуємося існуючою послугою не платячи за те, що могло б 
бути дуже дешевим, якби ним не завідували ненажерливі бариги[15], і ви 
називаєте нас злочинцями. Ми досліджуємо... і ви називаєте нас 
злочинцями. Ми шукаємо знання... і ви називаєте нас злочинцями. Ми 
існуємо без кольору шкіри, без національності і без релігійної 
нетерпимості... і ви називаєте нас злочинцями. Ви будуєте атомні бомби, 
ви ведете війни, ви вбиваєте, обманюєте, і брешете нам, намагаючись 
заставити нас повірити, що ви це робите для нашого блага, і попри все - 
це ми тут злочинці.

	Так, я злочинець. Мій злочин - моя допитливість. Мій злочин - 
оцінювати людей по тому, що вони кажуть і думають, а не по тому, як 
вони виглядають. Мій злочин в тому, що я вас перехитрив, і ви мене 
ніколи не пробачите за це.

	Я хакер, і це мій маніфест. Можливо ви зупините мене як особу, але ви 
ніколи не зупините нас всіх... зрештою, ми всі однакові.
	

Замітки:

  1. Ph-айл: worst of both worlds between phile and файл
  2. Damn kids: тупі/кляті/грьобані діти/школота1/малолітки2? Дякую цьому твіту Букви, який дає мені моральне право використовувати слово “школота”, бо нічого інше не клеїлося (“Окаяні дітлахи!")
  3. three-piece-psychology: інтерпретую як невисоку оцінку розвитку внутрішнього світу. Тому: пересічним/шаблонним/банальним/трафаретним3/примітивним/нехитрим/безхитрим; psychology: ‘інтелект’ але не зовсім, мені подобається ‘ментальність’
  4. and 1950’s technobrain: Німецький переклад, який сподобався англіцизмами та дав ідею перекласти technobrain в значенні “знання про компʼютери”, а не слово в слово: Berühmte Manifeste 2 – openPunk
  5. хакер/гакер: Вікіпедія вважає обидва допустимими; сам Авраменко ссилаючись на ті самі правила українського правопису теж вважає обидва допустимими, але все ж любить “г” більше (Хакер чи гакер - експрес-урок - YouTube). А я не можу і не буду. Хакер. I will die on this hill.
  6. what makes him tick: TODO, нічого не подобається. Що його рухає/надихає, що у нього в середині, …
  7. underachiever: хай буде “відстаючий”. Хоча пригадую з ЗНО, що суфікси уч/юч обмежені у вживанні, правильніше ВІДСТАЛИЙ мені не подобається.
  8. junior high or high school: тут додаю драми замість дослівності, тому що все ближче до оригіналу, що я можу придумати, занадто канцеляристично: “я закінчую базову чи повну загальну середню освіту”..?
  9. Ms. Smith:
  10. I’m a smart ass
  11. doesn’t like teaching: оплакую невикористаний варіант від душі “ненавидить себе, дітей, і педагогіку”. Дуже оплакую.
  12. a refuge from the day-to-day incompetencies is sought
  13. a board is found: мається на увазі електронна дошка оголошень (BBS — Вікіпедія), дід форумів і прадід іміджбордів. Найцікавіше слово для перекладу. Якщо буде “борд” то збережеться драматизм оригіналу, але є шанси, що хтось спутає з іміджбордами. Коли вони були популярні, нормальні люди в Україні їх не називали ніяк, російською були варіанти “доска”, “бибиэска”4. “BBS” був би найпростішим виходом; “електронна дошка оголошень” знову ж таки канцеляризм. По контексту далі очевидно, що мова йде про якесь спілкування, тому хай буде “борд”, принесу в жертву однозначність і зрозумілість милозвучності.
  14. you bet your ass we’re all alike: як же складно підбирати такі речі. Умовні embeddings з ML тут були б в тему. “Дай мені щось на кшталт ‘авжеж’ тільки більш emphatical”. Попередня версія “Авжеж ми всі однакові!”
    1. You bet – phrases: базара нет, по любому, я вас умоляю
    2. Будьте певні5
    3. ЩЕ Б ПАК — СИНОНІМІЯ | Горох — українські словники
      1. Авжеж?6
  15. the beauty of the baud: Бод — Вікіпедія Нехай мій (і єдиний можливий) переклад буде всім настільки ж зрозумілим, наскільки мені був зрозумілий оригінал, коли я його читав вперше.
  16. profitteering gluttons

Hat tip to:

Random: