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).
  4. Links blog, formerly my personal wiki.

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.

If you're in Germany, DHL sends packets with humanitarian help for free!

Latest posts from the Work log

Day 1796

Pip can easily install packages from github

Created pchr8/pymorphy-spacy-disambiguation: A package that picks the correct pymorphy2 morphology analysis based on morphology data from spacy to easily include it in my current master thesis code.

Later on releases pypi etc., but for now I just wanted to install it from github.

To my surprise, pip install git+https://github.com/pchr8/pymorphy-spacy-disambiguation worked as-is! Apparently pip is smart enough to parse the poetry project and run the correct commands.

poetry add git+https://github.com/pchr8/pymorphy-spacy-disambiguation works just as well.


Otherwise, locally:

poetry build

creates a ./dist directory with the package as installable/shareable files.

Also, TIL:

poetry show
poetry show  --tree --why colorama

show a neat colorful tree of package dependencies in the project.

How to read and write a paper according to hackernews

I’ll write here the main points from each of the linked PDF, copyright belongs to the original authors ofc.

How to Write a Paper

How to Write a Paper
Mike Ashby
Engineering Department, University of Cambridge, Cambridge
6 rd Edition, April 2005

This brief manual gives guidance in writing a paper about your research. Most of the advice applies equally to your thesis or to writing a research proposal.

This is based on 2016 version of the paper, more are here: https://news.ycombinator.com/item?id=38446418#38449638 with the link to the 2016 version being https://web.archive.org/web/20220615001635/http://blizzard.cs.uwaterloo.ca/keshav/home/Papers/data/07/paper-reading.pdf

  1. The design
    1. The market need - what is the purpose? Who will read it? How will it be used?
      1. Thesis / paper / research-proposal: 2023-12-01-141254_715x440_scrot.png
  2. Concept
    1. When you can’t write, it is because you don’t know what you want to say. The first job is to structure your thinking.

    2. A3 paper where you draw things:
      1. 2023-12-01-141421_654x520_scrot.png
      2. 2023-12-01-141527_646x494_scrot.png
    3. Don’t yet think of style, neatness or anything else. Just add, at the appropriate place on the sheet, your thoughts.

  3. Embodiement
    • the first draft
    • the PDF lists random bits about each sections, like abstract / introduction / …
    • Introduction:
      • What is the problem and why is it interesting?
      • Who are the main contributors?
      • What did they do?
      • What novel thing will you reveal?
    • Method
      • ‘just say what you did, succinctly’
    • Results
      • Same; also succinctly, without interpretation etc.
    • Appendices:
      • essential material that would interrupt the flow of the main text
  • Grammar!
    • 2023-12-01-142006_468x301_scrot.png
    • That VS which! 2023-12-01-142045_497x342_scrot.png
  • Punctuation:
    • really interested and itemized
    • Dashes: “The dash sets off parenthetic material that results in a break in continuity in a sentence. [..] A dash can lead to an upshot, a final summary word or statement, and give emphasis:”
    • Parentheses—literally: putting-asides—embrace material of all sorts, and help structure scientific writing. But do not let them take over, clouding the meaning of the sentence with too many asides.
    • Italics: the best of the three ways (with bold and underline) to emphasize stuff in scientific writing.
    • Brackets are used to indicate editorial comments or words inserted as explanation: [continued on p. 62], [see footnote].
  • Style
    • Be clear. Use simple language,familiar words, etc.
    • Design: Remember who you are writing for. Tell them what they want to know, not what they know already or do not want to know.
    • Define everything
    • Avoid cliches; avoid empty words
      • Avoid clichés (standard formalised phrases): they are corpses devoid of the vitality which makes meaning spring from the page

      • 2023-12-01-142935_519x425_scrot.png
    • Do not overstate, over emphasise or apologise: не верь, не бойся не проси 2023-12-01-143131_526x767_scrot.png
    • Avoid being patronising, condescending or eccentric
    • Good first sentence:
      • Openings such as: It is widely accepted that X (your topic) is important … has the reader yawning before you’ve started.
  • At the end it has examles of effective and ineffective writing
  • At the very end it has this: 2023-12-01-143421_683x801_scrot.png

How to read a paper

How to Read a Paper
S. Keshav
David R. Cheriton School of Computer Science, University of Waterloo
Waterloo, ON, Canada
keshav@uwaterloo.ca

http://ccr.sigcomm.org/online/files/p83-keshavA.pdf

  • Three passes of varying levels of thoroughness
  • Literature survery:
    • also three steps:
      1. find recent papers in the area through google scholar etc.
      2. find top conferences
      3. look through their recent conference proceedings

Day 1792

Rancher secrets and config maps

Using Kubernetes envFrom for environment variables describes how to get env variables from config map or secret, copying here:

#####################  
### deployment.yml
#####################  
# Use envFrom to load Secrets and ConfigMaps into environment variables

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: mans-not-hot
  labels:
    app: mans-not-hot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mans-not-hot
  template:
    metadata:
      labels:
        app: mans-not-hot
    spec:
      containers:
        - name: app
          image: gcr.io/mans-not-hot/app:bed1f9d4
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          envFrom:
          - configMapRef:
              name: env-configmap
          - secretRef:
              name: env-secrets
#####################  
### env-configmap.yml
#####################  
# Use config map for not-secret configuration data

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-configmap
data:
  APP_NAME: Mans Not Hot
  APP_ENV: production
  
#####################  
### env-secrets.yml
#####################  
# Use secrets for things which are actually secret like API keys, credentials, etc
# Base64 encode the values stored in a Kubernetes Secret: $ pbpaste | base64 | pbcopy
# The --decode flag is convenient: $ pbpaste | base64 --decode

apiVersion: v1
kind: Secret
metadata:
  name: env-secrets
type: Opaque
data:
  DB_PASSWORD: cDZbUGVXeU5e0ZW
  REDIS_PASSWORD: AAZbUGVXeU5e0ZB
@caiquecastro

This is neater than what I used before, listing literally all of them:

spec:
  containers:
    - name: name
      image: image
      env:
        - name: BUCKET_NAME
          valueFrom:
            configMapKeyRef:
              name: some-config
              key: BUCKET_NAME

pytest and lru_cache

I have a pytest of a function that uses python @lru_cache:

    cacheinfo = gbif_get_taxonomy_id.cache_info()
    assert cacheinfo.hits == 1
    assert cacheinfo.misses == 2

LRU cache gets preserved among test runs, breaking independence and making such bits fail.

Enter pytest-antilru · PyPI which resets the LRU cache between test runs. Installing it as a python package is all there’s to ite.

Passing booleans to python argparse as str

Needed argparse to accept yes/no decisions, should have been used inside a dockerfile that doesn’t have if/else logic, and all solutions except getting a parameter that accepts string like true/false seemed ugly.

The standard linux --do-thing and --no-do-thing were also impossible to do within Docker, if I want to use an env. variable etc., unless I literally set them to --do-thing which is a mess for many reasons.

I had 40 tabs open because apparently this is not a solved problem, and all ideas I had felt ugly.

How do I convert strings to bools in a good way? (bool alone is not an option because bool('False') etc.)

Basic if value=="true" would work, but maybe let’s support other things as a bonus because why not.

My first thought was to see what YAML does, but then I found the deprecated in 3.12 distutils.util.strtobool: 9. API Reference — Python 3.9.17 documentation

It converts y,yes,t,true,on,1 / n,no,f,false,off,0 into boolean True/False.

The code, the only reason it’s a separate function (and not a lambda inside the type= parameter) was because I wanted a custom ValueError and to add the warning for deprecation, as if Python would let me forget. An one-liner was absolutely possible here as well.

def _str_to_bool(x: str):
    """Converts value to a boolean.

    Currently uses (the rules from) distutils.util.strtobool:
        (https://docs.python.org/3.9/distutils/apiref.html#distutils.util.strtobool)
        True values are y, yes, t, true, on and 1
        False values are n, no, f, false, off and 0
        ValueError otherwise.

    ! distutils.util.strtobool is deprecated in python 3.12
        TODO solve it differently by then

    Args:
        value (str): value
    """
    try:
        res = bool(strtobool(str(x).strip()))
    except ValueError as e:
        logger.error(
            f"Invalid str-to-bool value '{x}'. Valid values are: y,yes,t,true,on,1 / n,no,f,false,off,0."
        )
        raise e
    return res

# inside argparse
    parser.add_argument(
        "--skip-cert-check",
        help="Whether to skip a cert check (%(default)s)",
        type=_str_to_bool,
        default=SKIP_CERT_CHECK,
    )

This allows:

  • sane human-readable default values specified elsewhere
  • use inside Dockerfiles and Rancher configmaps etc. where you just set it to a plaintext value
  • no if/else bits for --no-do-thing flags

distutils is deprecated in 3.12 though :(


YAML is known for it’s bool handling: Boolean Language-Independent Type for YAML™ Version 1.1.

Regexp:

y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF`

I don’t like it and think it creates more issues than it solves, e.g. the “Norway problem” ([[211020-1304 YAML Norway issues]]), but for CLI I think that’s okay enough.

Day 1791 / Krita awesomeness

Wanted to do coloring and remembered about Krita and the tutorial about flat coloring (Flat Coloring — Krita Manual 5.2.0 documentation) mentioned the Colorize Mask and it’s awesome!

Needed to actually understand it, and even had to watch a video tutorial (Tutorial: Coloring with “Colorize-mask” in Krita - YouTube) but it was so worth it!

It’s basically a bucket fill tool on steroids, and even might be reason enough to move away from Inkscape for some of these tasks!

Cleaned lineart: 2023-11-26-174647_1139x805_scrot.png

Mask (red is transparent): 2023-11-26-183727_1284x918_scrot.png

Result: 2023-11-26-183752_1171x760_scrot.png

Result with random brushes moon texture below it: 2023-11-26-184154_1140x739_scrot.png

Interesting bits:

  • any unfilled areas will be filled, that is - if there’s an area that should be left alone it has to be explicitly marked as transparent or any color. This was the most confusing to me at first
  • The colorize mask layer should be Multiply, but if there’s anything else below it it’ll be a mess - sometimes it should just be converted to a paint layer w/ the correct settings to see what it will look like in the end
  • if you want to remove all instances of a specific color and use color select by color tool for that - it WILL be a mess because borders, and the color mask tool has already a button to remove a color, USE IT.

Day 1782 / 'Roter Faden'

Heard the expression “roter Faden”, googled it, and it’s actually interesting and relevant.

In a scientific context, it’s the main topic / leitmotiv / … of the text. You ask a question, and all parts of the text should work together to answer it, relating to it in a clear way.

Excellent (PDF) link on this exact topic in scientific writing & an itemized list of ways to make it clear: https://www.uni-osnabrueck.de/fileadmin/documents/public/1_universitaet/1.3_organisation/sprachenzentrum/schreibwerkstatt/Roter_Faden_Endversion.pdf

TODO hypothetically save it from link rot somewhere

Also:

  • untermauern: underpin
    • durch ein Grafik XXX_(Akk.)_ untermauern

Day 1781

python progressbar2

wolph/python-progressbar: Progressbar 2 - A progress bar for Python 2 and Python 3 - “pip install progressbar2” really cool flexible progressbar.

Also: progressbar.widgets — Progress Bar 4.3b.0 documentation:

Examples of markers:
	 - Smooth: ` ▏▎▍▌▋▊▉█` (default)
	 - Bar: ` ▁▂▃▄▅▆▇█`
	 - Snake: ` ▖▌▛█`
	 - Fade in: ` ░▒▓█`
	 - Dots: ` ⡀⡄⡆⡇⣇⣧⣷⣿`
	 - Growing circles: ` .oO`

Export all papers of an author from Google Scholar to BibTex

You can export your own papers as single file and the entire Internet tells you how. But if you’re NOT the author, this is a workaround I found:

  • Add the papers to your library
  • Export them all from your library!

Day 1774

Sad clown paradox

I’ll restart https://serhii.net/links later, and this will be the first bit I’ll add there:

Sad clown paradox - Wikipedia

TL;DR comedians are associated with depression/anxiety:

Humour has been shown to develop from a young age, fostered by parental behaviour. A parent’s immature nature can lead to additional responsibilities forced onto children, which can evoke issues of self-worth and a need for acceptance. The constant search for approval may cause mental health issues such as anxiety or depression […] Laughter can evolve as a medium for self-preservation, detaching the individual from any adversity faced allowing for perceived control over uncomfortable situations.

Sad clown paradox is characterised by a cyclothymic temperament, which encourages the creation of light-hearted humour in a professional setting, despite inner turmoil.

llm python module for CLI llm or chatGPT use

Github: simonw/llm: Access large language models from the command-line


Originally seen here: Patrick McKenzie on X: “You might not know about @simonw’s command line ’llm’ tool. Here let me demo it. git log | head -n 200 | llm -s “Of the most recent 5 commits, which is probably the most important? I use ‘Minor’ and similar commit messages to mark unimportant commits.” https://t.co/jtxV6ULwKc” / X

The example from the tweet:

git log | head -n 200 | llm -s "Of the most recent 5 commits, which is probably the most important? I use 'Minor' and similar commit messages to mark unimportant commits."

llm on pypy

Day 1767

Wowchemy basics

TIL wowchemy exists, and wowchemy/starter-hugo-research-group: 👥 轻松创建研究组或组织网站 Easily create a stunning Research Group, Team, or Business Website with no-code is one template there that I’ll use to start learning about it.

This will be much messier than the average post in the Diensttagebuch

Their documentation seems to be undergoing some overhaul and half of the links don’t work and half don’t open in qutebrowser, will do what I can

Idea

The main idea seems to be that blocks can live in different .md files in a folder, and are shown in the page based on their “weight” argument.

Blocks

Page collection

Wowchemy has different block types, one is Page Collection | Wowchemy for a collection of pages. A la page list in vanilla Hugo.

Actually there’s 🧱 Build your pages with blocks: no-code required! | Wowchemy Docs that’s closer to that

Page features

https://university.wowchemy.com/reference/page-features/

More bits

type: widget_page

means it’ll parse the pages AND DIRECTORIES inside the dir it’s located in as widgets, example of this is the home page.

I see no way to include two different lists of pages inside the directory without having all these pages also appear as widgets - in other words, how to “include” pages in that subfolder from some of the widgets but not the widgets page itself.

But - now I see why the home page is inside ./content/home

ChatGPT is awesome to generate dummy data!

So, this: https://chat.openai.com/share/764434d6-ceba-4b9d-8cfc-7899f73f9cd3

You can enter a dummy markdown file or whatever and ask it to generate some other similar files! Like lorem ipsum but way way cooler and more open to nuance

Day 1758

Tqdm and logging

This[^1] redirects python logging to tqdm.write() that plays better with tqdm progress bars:

from tqdm.contrib.logging import logging_redirect_tqdm
# ..
with logging_redirect_tqdm():
	pass

Master thesis task CBT

Basics

TODOs

  • deduplicate options etc. by lemma (синку-син-??)
  • gender of the noun giving hints!
  • the bits below

Issues/Problems/TODOs

Multiple possible answers

— Синку, як ти мене знайшов? — запитав батько. — Коли вже так, віднеси обід до джерела, я туди прийду і поїмо
QUESTION:	— Ні, батьку, — сказав ______ .
OPTIONS:	{'хлопець', 'хлопчик', 'син', 'цар'}

Complex structures

 Будь ______ , пообідайте з нами!', options={'ласка', 'ножа', 'жаль', 'візир', 'дозволь'}, answer='ласка')

Unknown/unknowable answer

│ context = 'Ein Mann und eine Frau hatten einen goldenen Ring. Das war ein     │
│           Glücksring, und wer ihn besaß, hatte immer genug zu leben. Sie      │
│           wußten es aber nicht und verkauften den Ring für wenig Geld. Kaum   │
│           war der Ring aus dem Hause, da wurden sie immer ärmer und wußten    │
│           schließlich nicht mehr, woher sie genug zum Essen nehmen sollten.   │
│           Sie hatten auch einen Hund und eine Katze, die mußten mit ihnen     │
│           Hunger leiden. Da ratschlagten die Tiere miteinander, wie sie den   │
│           Leuten wieder zu ihrem alten Glück verhelfen könnten.'              │
I'll be using "Label all tasks"  then it would show me the next CBT after I submit. 

Keybindings are nice for classifying text.

When importing  the things, I should try to do text highlighting or whatever to make it easier visually.

Code notes

Multiple hard options

Sometimes it gives multiple options

[
    Parse(
        word='корів',
        tag=OpencorporaTag('NOUN,inan plur,gent'),
        normal_form='кір',
        score=1.0,
        methods_stack=((DictionaryAnalyzer(), 'корів', 498, 11),)
    ),
    Parse(
        word='корів',
        tag=OpencorporaTag('NOUN,anim plur,gent'),
        normal_form='корова',
        score=1.0,
        methods_stack=((DictionaryAnalyzer(), 'корів', 2063, 8),)
    ),
    Parse(
        word='корів',
        tag=OpencorporaTag('NOUN,anim plur,accs'),
        normal_form='корова',
        score=1.0,
        methods_stack=((DictionaryAnalyzer(), 'корів', 2063, 10),)
    )
]

I can find the right one:

2023-11-29 11:46

2-3-4 and multiple plurals

(Pdb++) t.tag.numeral_agreement_grammemes(1)
{'sing', 'nomn'}
(Pdb++) t.tag.numeral_agreement_grammemes(2)
{'sing', 'gent'}
(Pdb++) t.tag.numeral_agreement_grammemes(3)
{'sing', 'gent'}
(Pdb++) t.tag.numeral_agreement_grammemes(4)
{'sing', 'gent'}
(Pdb++) t.tag.numeral_agreement_grammemes(5)
{'plur', 'gent'}
(Pdb++) t.tag.numeral_agreement_grammemes(6)
{'plur', 'gent'}
(Pdb++) self.morph.parse("стіл")[1].inflect({'plur'}).tag.number
'plur'
(Pdb++) self.morph.parse("стіл")[1].tag.number
(Pdb++)

Yes:

(Pdb++) pp self.morph.parse("столи")[1].lexeme
[Parse(word='стіл', tag=OpencorporaTag('NOUN,inan masc,nomn'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'стіл', 2710, 0),)),
 Parse(word='стола', tag=OpencorporaTag('NOUN,inan masc,gent'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'стола', 2710, 1),)),
 Parse(word='столу', tag=OpencorporaTag('NOUN,inan masc,gent'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столу', 2710, 2),)),
 Parse(word='столові', tag=OpencorporaTag('NOUN,inan masc,datv'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столові', 2710, 3),)),
 Parse(word='столу', tag=OpencorporaTag('NOUN,inan masc,datv'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столу', 2710, 4),)),
 Parse(word='стіл', tag=OpencorporaTag('NOUN,inan masc,accs'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'стіл', 2710, 5),)),
 Parse(word='стола', tag=OpencorporaTag('NOUN,inan masc,accs'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'стола', 2710, 6),)),
 Parse(word='столом', tag=OpencorporaTag('NOUN,inan masc,ablt'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столом', 2710, 7),)),
 Parse(word='столі', tag=OpencorporaTag('NOUN,inan masc,loct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столі', 2710, 8),)),
 Parse(word='столові', tag=OpencorporaTag('NOUN,inan masc,loct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столові', 2710, 9),)),
 Parse(word='столу', tag=OpencorporaTag('NOUN,inan masc,loct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столу', 2710, 10),)),
 Parse(word='столе', tag=OpencorporaTag('NOUN,inan masc,voct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столе', 2710, 11),)),
 Parse(word='столи', tag=OpencorporaTag('NOUN,inan plur,nomn'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столи', 2710, 12),)),
 Parse(word='столів', tag=OpencorporaTag('NOUN,inan plur,gent'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столів', 2710, 13),)),
 Parse(word='столам', tag=OpencorporaTag('NOUN,inan plur,datv'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столам', 2710, 14),)),
 Parse(word='столи', tag=OpencorporaTag('NOUN,inan plur,accs'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столи', 2710, 15),)),
 Parse(word='столами', tag=OpencorporaTag('NOUN,inan plur,ablt'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столами', 2710, 16),)),
 Parse(word='столах', tag=OpencorporaTag('NOUN,inan plur,loct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столах', 2710, 17),)),
 Parse(word='столи', tag=OpencorporaTag('NOUN,inan plur,voct'), normal_form='стіл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'столи', 2710, 18),))]

Day 1752

tqdm for iterators with known lengths; manual updating

Add a total= int parameter to tqdm.tqdm()1:

for index, row in tqdm(df.iterrows(), total=df.shape[0]):
   print("index",index)
   print("row",row)

Also, you can manually update tqdm bars:

with tqdm(total=num_articles, desc="total") as pbar:
	# ...
	pbar.update(10)
	# or just pbar.update()

Speedtest-cli and cloudflare's cooler alternative

Python package speedtest-cli does what it says on the tin.

BUT! TIL it has options, most useful ones being:

  --no-download         Do not perform download test
  --no-upload           Do not perform upload test
  --simple              Suppress verbose output, only show basic information
  --csv                 Suppress verbose output, only show basic information in CSV format. Speeds listed in bit/s and not affected by --bytes
  --json                Suppress verbose output, only show basic information in JSON format. Speeds listed in bit/s and not affected by --bytes
  --mini MINI           URL of the Speedtest Mini server

Also: allegedly all providers treat speedtest-net as special for PR purposes.

Ergo:

Day 1751 / Overleaf zooming in in the PDF

Is there a way to adjust the zoom level of the displayed pdf? - Overleaf, Online-LaTeX-Editor: “move your mouse near to the top-left of the PDF preview panel” and then you see the settings. Can’t call that intuitive


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: