master
Miloslav Ciz 2 years ago
parent af3e90bf66
commit 5db91153c8

@ -2,19 +2,19 @@
Cryptocurrency, or just *crypto*, is a digital, virtual (non-physical) currency used on the [Internet](internet.md) which uses [cryptographic](cryptography.md) methods (electronic signatures etc.) to implement a [decentralized](decentralized.md) system in which there is no authority to control the currency (unlike e.g. with traditional currencies that are controlled by the state or systems of digital payments controlled by the banks that run these systems). Cryptocurrencies use so called **[blockchain](blockchain.md)** as an underlying technology and are practically always implemented as [free and open-source software](foss.md). Example of cryptocurrencies are [Bitcoin](bitcoin.md), [Monero](monero.md) or [Dogecoin](dogecoin.md).
The word *crypto* in *crpytocurrency* **doesn't imply that the currency provides or protects privacy** -- it rather refers to the cryptographic algorithms used to make the currency work -- even though thanks to the decentralization, anonymity and openness cryptocurrencies actually are privacy friendly (up to the points of being considered the currency of criminals).
The word *crypto* in *crpytocurrency* **doesn't imply that the currency provides or protects privacy** -- it rather refers to the cryptographic algorithms used to make the currency work -- even though thanks to the decentralization, anonymity and openness cryptocurrencies actually are mostly privacy friendly (up to the points of being considered the currency of criminals).
[LRS](lrs.md) sees cryptocurrencies more or less as **unethical** because in our view money itself is unethical, plus the currencies based on proof of work waste not only human effort but also enormous amount of electricity and computing power that could be spent in a better way.
[LRS](lrs.md) sees cryptocurrencies more or less as **unethical** because in our view money itself is unethical, plus the currencies based on proof of work waste not only human effort but also enormous amount of electricity and computing power that could be spent in a better way. Crypto is just an immensely expensive game in which people try to fuck each other over money that have been stolen from the people.
# History
TODO
# How it Works
# How It Works
Cryptocurrency is build on top of so called [blockchain](blockchain.md) -- a kind structure that holds records of transactions (exchanges of money or "coins", as called in the crypto world). Blockchain is a [data structure](data-structure.md) serving as a [database](database.md) of the system. As its name suggests, it consists of **blocks**. Each block contains various data, most important of which are performed transactions (e.g. "A sent 1 coin to B"), and each block points to a previous one (forming a [linked list](linked_list.md)). As new transactions are made, new blocks are created and appended at the end of the blockchain.
But where is the blockchain stored? It is not on a single computer; many computers participating in the system have a their own copy of the blockchain and they share it together (similarly to how people share files via [torrents](torrent.md)).
But where is the blockchain stored? It is not on a single computer; many computers participating in the system have their own copy of the blockchain and they share it together (similarly to how people share files via [torrents](torrent.md)).
But how do we know which one is the "official" blockchain? Can't just people start forging information in the blockchain and then distribute the fake blockchains? Isn't there a chaos if there are so many copies? Well yes, it would be messy -- that's why we need a **consensus** of the participants on which blockchain is the *real* one. And there are a few algorithms to ensure the consensus. Basically people can't just spam add new blocks, a new block to be added needs to be validated via some process (which depends on the specific algorithm) in order to be accepted by others. Two main algorithms for this are:

@ -0,0 +1,15 @@
# Double Buffering
In [computer graphics](graphics.md) double buffering is a technique of rendering in which we do not draw directly to [video RAM](vram.md), but instead to a second "back buffer", and only copy the rendered frame from back buffer to the video RAM ("front buffer") once the rendering has been completed; this prevents flickering and displaying of incompletely rendered frames on the display. Double buffering requires a significant amount of extra memory for the back buffer, however it is also necessary for how graphics is rendered today.
In most libraries and frameworks today you don't have to care about double buffering, it's done automatically. For this reason in many frameworks you often need to indicate the end of rendering with some special command such as `flip`, `endFrame` etc. If you're going lower level, you may need to implement double buffering yourself.
Though we encounter the term mostly in computer graphics, the principle of using a second buffer in order to ensure the result is presented only when it's ready can be applied also elsewhere.
Let's take a small example: say we're rendering a frame in a 3D game. First we render the environment, then on top of it we render the enemies, then effects such as explosions and then at the top of all this we render the [GUI](gui.md). Without double buffering we'd simply be rendering all these pixel into the front buffer, i.e. the memory that is immediately shown on the display. This would lead to the user literally seeing how first the environment appears, then enemies are drawn over it, then effects and then the GUI. Even if all this redrawing takes an extremely short time, it is also the case that the final frame will be shown for a very short time before another one will start appearing, so in the result the user will see huge flickering: the environment may look kind of normal but the enemies, effects and GUI may appear transparent because they are only visible for a fraction of the frame. The user also might be able to see e.g. enemies that are supposed to be hidden behind some object if that object is rendered after the enemies. With double buffering this won't happen as we perform the rendering into the back buffer, a memory which doesn't show on the display. Only when we have completed the frame in the back buffer, we copy it to the front buffer, pixel by pixel. Here the user may see the display changing from the old frame to the new one from top to the bottom, but he will never see anything temporary, and since the old and new frames are usually very similar, this top-to-bottom update may not even be distracting (it is addressed by [vertical synchronization](vsync.md) if we really want to get rid of it).
There also exists [triple buffering](triple_buffering.md) which uses yet another additional buffer to increase [FPS](fps.md). With double buffering we can't start rendering a new frame into back buffer until the back buffer has been copied to the front buffer which may further be delayed by [vertical synchronization](vsync.md), i.e. we have to wait and waste some time. With triple buffering we can start rendering into the other back buffer while the other one is being copied to the front buffer. Of course this consumes significantly more memory. Also note that triple buffering can only be considered if the hardware supports parallel rendering and copying of data, and if the FPS is actually limited by this... mostly you'll find your FPS bottleneck is elsewhere in which case it makes no sense to try to implement triple buffering. On small devices like embedded you probably shouldn't even think about this.
Double buffering can be made more efficient by so called page flipping, i.e. allowing to switch the back and front buffer without having to physically copy the data, i.e. by simply changing the [pointer](pointer.md) of a display buffer. This has to be somehow supported by hardware.
**When do we actually need double buffering?** Not always, we can avoid it or suppress its memory requirements if we need to -- we may want to do this e.g. in [embedded](embedded.md) programming where we want to save every byte of RAM. The mainstream computers nowadays simply always run on a very fast FPS and keep redrawing the screen even if the image doesn't change, but if you write a program that only occasionally changes what's on the screen (e.g. an e-book reader), you may simply leave out double buffering and actually render to the front buffer once the screen needs to change, the user probably won't notice any flicker during a single quick frame redraw. You also don't need double buffering if you're able to compute the final pixel color right away, for example with [ray tracing](ray_tracing.md) you don't need any double buffering, unless of course you're doing some complex [postprocessing](postprocessing.md). Double buffering is only needed if we compute a pixel color but that color may still change before the frame is finished. You may also only use a partial double buffer if that is possible (which may not be always): you can e.g. split the screen into 16 regions and render region by region, using only a 1/16th size double buffer. Using a [palette](palette.md) can also make the back buffer smaller: if we use e.g. a 256 color palette, we only need 1 byte for every pixel of the back buffer instead of some 3 bytes for full [RGB](rgb.md). The same goes for using a smaller resolution that is the actual native resolution of the screen.

@ -5,6 +5,7 @@ Here let be listed exercises for the readers of this wiki. You can allow yoursel
1. What's the difference between [free software](free_software.md) and [open source](open_source.md)?
2. Say we have an algorithm that finds all pairs of equal numbers in an array of numbers of length *N* and adds all of these (unordered) pairs to a set *S*. The algorithm is (pseudocode): `for i := 0 to N: for j := 0 to N: if numbers[i] == numbers[j]: add(S,pair(i,j))`. How can we optimize the algorithm in terms of its execution speed (i.e. make it perform fewer operations while keeping its results the same)? How did the asymptotic time complexity ("big O") class change?
3. In computer graphics, what is the difference between ray casting, ray tracing and path tracing?
4. Why are manhole lids round and not square?
## Solutions
@ -32,4 +33,8 @@ While the first algorithm performs N^2 comparisons, the new one only needs N - 1
**solution 3**:
They are all image-order methods of 3D [rendering](rendering.md). [Ray casting](ray_casting.md) casts a single ray for each screen pixel and determines the pixel color from a single hit of the ray. [Ray tracing](ray_tracing.md) is a [recursive](recursion.md) form of ray casting -- it recursively spawns secondary rays from the first hit to more accurately determine the pixel color, allowing for effects such as shadows, reflections or refractions. Path tracing is a method also based on casting rays, but except for the primary rays the rays are cast at random (i.e. it is a [Monte Carlo](monte_carlo.md) method) to approximately solve the rendering equation, progressively computing a more accurate version of the image (i.e. the image contains significant noise at the beginning which lowers with more iterations performed) -- this allows computing [global illumination](global_illumination.md), i.e. a very realistic lighting that the two previous methods can't achieve.
They are all image-order methods of 3D [rendering](rendering.md). [Ray casting](ray_casting.md) casts a single ray for each screen pixel and determines the pixel color from a single hit of the ray. [Ray tracing](ray_tracing.md) is a [recursive](recursion.md) form of ray casting -- it recursively spawns secondary rays from the first hit to more accurately determine the pixel color, allowing for effects such as shadows, reflections or refractions. Path tracing is a method also based on casting rays, but except for the primary rays the rays are cast at random (i.e. it is a [Monte Carlo](monte_carlo.md) method) to approximately solve the rendering equation, progressively computing a more accurate version of the image (i.e. the image contains significant noise at the beginning which lowers with more iterations performed) -- this allows computing [global illumination](global_illumination.md), i.e. a very realistic lighting that the two previous methods can't achieve.
**solution 4**:
Round lid can't fall into the hole.

@ -4,7 +4,7 @@
Future-proof technology is technology that is very likely to stay functional for a very long time with minimal to no maintenance. This feature is generally pretty hard to achieve and today's [consoomerist](consumerism.md) society makes the situation much worse by focusing on immediate profit without long-term planning and by implementing things such as [bloat](bloat.md) and [planned obsolescence](planned_obsolescence.md).
A truly good technology is trying to be future-proof because this saves us the great cost of maintenance and reinventing wheels.
A [truly good technology](lrs.md) is trying to be future-proof because this saves us the great cost of maintenance and reinventing wheels.
Despite the extremely bad situation not all hope is lost. At least in the world of [software](software.md) future-proofing can be achieved by:

@ -26,10 +26,14 @@ By 1800 Alessandro Volta invented an **electric battery**. In 1827 André-Marie
In 1822 [Charles Babbage](charles_babbage.md), a great English mathematician, completed the first version of a manually powered **[digital](digital.md) mechanical computer** called the Difference Engine to help with the computation of [polynomial](polynomial.md) [derivatives](derivative.md) to create mathematical tables used e.g. in navigation. It was met with success and further development was funded by the government, however difficulties of the construction led to never finishing the whole project. In 1837 Babbage designed a new machine, this time a **[Turing complete](turing_complete.md) general purpose computer**, i.e. allowing for programming with branches and loops, a true marvel of technology. It also ended up not being built completely, but it showed a lot about what computers would be, e.g. it had an [assembly](assembly.md)-like programming language, memory etc. For this computer [Ada Lovelace](ada_lovelace.md) would famously write the Bernoulli number algorithm.
In 1826 or 1827 French inventor Nicéphore Niépce captured **first [photography](photo.md)** that survived until today -- a view from his estate named Le Gras. About an 8 hour exposure was used (some say it may have taken several days). He used a [camera obscura](camera_obscura.md) and asphalt plate that hardened where the light was shining. Earlier cases of photography existed maybe as early as 1717, but they were only short lived.
**Sound recording** with phonatograph was invented in 1857 in Paris, however it could not be played back at the time -- the first record of human voice made with this technology can nowadays be reconstructed and played back. It wouldn't be until 1878 when people could both record and play back sounds with [Edison](edison.md)'s improvement of phonatograph. A year later, in 1879, Edison also patented the **light bulb**, even though he didn't invent it -- there were at least 20 people who created a light bulb before him.
Around 1888 so called **war of the currents** was taking place; it was a heated battle between companies and inventors for whether the [alternating](ac.md) or [direct](dc.md) current would become the standard for distribution of electric energy. The main actors were [Thomas Edison](edison.md), a famous iventor and a huge capitalist dick rooting for DC, and George Westinghouse, the promoter of AC. Edison and his friends used false claims and even killing of animals to show that AC was wrong and dangerous, however AC was objectively better, e.g. by its efficiency thanks to using high voltage, and so it ended up winning the war. AC was also supported by the famous genius inventor [Nikola Tesla](tesla.md) who during these times contributed hugely to electric engineering, he e.g. invented an AC motor and Tesla coil and created a system for wireless transmission of electric power.
Also in 1888 probably the **first [video](video.md)** that survived until today was recorded by Lou Le Prince in Northern England, with a single lens camera. It is a nearly 2 second silent black and white shot of people walking in a garden.
1895 can roughly be seen as the year of **invention of radio**, specifically wireless [telegraph](telegraph.md), by Italian engineer and inventor Guglielmo Marconi. He built on top of work of others such as [Hertz](hertz.md) and [Tesla](tesla.md) and created a device with which he was able to wirelessly ring a bell at a distance over 2 km.
On December 17 1903 the Wright brothers famously performed the **first controlled flight of a motor airplane** which they built, in North Carolina. In repeated attempts they flew as far as 61 meters over just a few seconds.
@ -42,8 +46,6 @@ In 1924 about 50% of US households own a car.
October 22 1925 has seen the invention of **[transistor](transistor.md)** by Julius Lilienfeld (Austria-Hungary), a component that would replace vacuum tubes thanks to its better properties, and which would become probably the most essential part of computers. At the time the invention didn't see much attention, it would only become relevant decades later.
In 1826 or 1827 French inventor Nicéphore Niépce captured **first [photography](photo.md)** that survived until today -- a view from his estate named Le Gras. About an 8 hour exposure was used (some say it may have taken several days). He used a [camera obscura](camera_obscura.md) and asphalt plate that hardened where the light was shining. Earlier cases of photography existed maybe as early as 1717, but they were only short lived.
In 1931 [Kurt Gödel](kurt_godel.md), a genius mathematician and logician from Austria-Hunagry (nowadays Czech Republic), published revolutionary papers with his [incompleteness theorems](incompleteness.md) which proved that, simply put, mathematics has fundamental limits and "can't prove everything". This led to [Alan Turing](turing.md)'s publications in 1936 that nowadays stand as the **foundations of [computer science](compsci.md)** -- he introduced a theoretical computer called the **[Turing machine](turing_machine.md)** and with it he proved that computers, no matter how powerful, will never be able to "compute everything". Turing also predicted the importance of computers in the future and has created several [algorithms](algorithm.md) for future computers (such as a [chess](chess.md) playing program).
In 1938 [Konrad Zuse](konrad_zuse.md), a German engineer, constructed **[Z1](z1.md), the first working electric mechanical [digital](digital.md) partially programmable computer** in his parents' house. It weighted about a ton and wasn't very reliable, but brought huge innovation nevertheless. It was programmed with punched film tapes, however programming was limited, it was NOT [Turing complete](turing_complete.md) and there were only 8 instructions. Z1 ran on a frequency of 1 to 4 Hz and most operations took several clock cycles. It had a 16 word memory and worked with [floating point](float.md) numbers. The original computer was destroyed during the war but it was rebuilt and nowadays can be seen in a Berlin museum.

@ -43,37 +43,42 @@ With that said, the politics behind LRS is [anarcho pacifist](anpac.md) [communi
The "official" LRS programs and libraries have so far been solely developed by [drummyfish](drummyfish.md), the "founder" of LRS. These include:
- [Anarch](anarch.md): Game similar to [Doom](doom.md).
- [raycastlib](raycastlib.md): Advanced 2D [raycasting](raycasting.md) rendering library.
- [SAF](saf.md): Tiny library for small portable games.
- [small3dlib](small3dlib.md): Simple software rasterizer for 3D rendering.
- [smallchesslib](smallchesslib.md): Simple [chess](chess.md) library and engine ([AI](ai.md)).
- **[Anarch](anarch.md)**: Game similar to [Doom](doom.md).
- **[raycastlib](raycastlib.md)**: Advanced 2D [raycasting](raycasting.md) rendering library.
- **[SAF](saf.md)**: Tiny library for small portable games.
- **[small3dlib](small3dlib.md)**: Simple software rasterizer for 3D rendering.
- **[smallchesslib](smallchesslib.md)**: Simple [chess](chess.md) library and engine ([AI](ai.md)).
Apart from this software a lot of other software developed by other people and groups can be considered LRS, at least to a high degree (there is usually some minor inferiority e.g. in licensing). Especially [suckless](suckless.md) software mostly fits the LRS criteria. The following programs and libraries can be considered LRS at least to some degree:
- [brainfuck](brainfuck.md)
- [dwm](dwm.md)
- [OpenBSD](openbsd.md)
- [LIL](lil.md)
- [lisp](lisp.md)
- [st](st.md)
- [badwolf](badwolf.md)
- [surf](surf.md)
- [tcc](tcc.md)
- [vim](vim.md)
- [Simon Tatham's portable puzzle collection](stppc.md)
- **[brainfuck](brainfuck.md)**: Extremely simple [programming language](programming_language.md).
- **[dwm](dwm.md)**: Official [suckless](suckless.md) [window manager](wm.md).
- **[OpenBSD](openbsd.md)**: Cool [operating system](os.md).
- **[LIL](lil.md)**: Tiny embeddable [scripting](script.md) programming language.
- **[lisp](lisp.md)**: Programming language with a pretty elegant design.
- **[st](st.md)**: Official [suckless](suckless.md) [terminal emulator](terminal.md).
- **[badwolf](badwolf.md)**: Very small yet very usable [web browser](browser.md).
- **[FORTH](forth.md)**: Small programming language with very nice design.
- **[surf](surf.md)**: Official [suckless](suckless.md) [web browser](browser.md).
- **[tcc](tcc.md)**: Small [C](c.md) [compiler](compiler.md) (alternative to [gcc](gcc.md)).
- **[musl](musl.md)**: Tiny [C](c.md) standard library (alternative to [glibc](glibc.md)).
- **[vim](vim.md)** (kind of): [TUI](tui.md) text/[programming](programming.md) [editor](editor.md). Vim is actually relatively big but there are smaller builds, flavors and alternatives.
- **[Simon Tatham's portable puzzle collection](stppc.md)**: Very portable collection of puzzle [games](game.md).
Other potentially LRS software to check out may include [TinyGL](tinygl.md), [scc](scc.md), [uClibc](uclibc.md), [miniz](miniz.md), [nuklear](nuklear.md), [dmenu](dmenu.md), [sbase](sbase.md), [sic](sic.md), [tabbed](tabbed.md), [svkbd](svkbd.md), [busybox](busybox.md) and others.
It is also possible to talk about LRS data formats, standards, designs and concepts as such etc. These might include:
- [ASCII](ascii.md)
- [RGB332](rgb332.md), [RGB565](rgb565.md)
- [bytebeat](bytebeat.md)
- [farbfeld](farbfeld.md)
- [json](json.md)
- [lambda calculus](lambda_calculus.md)
- [markdown](markdown.md)
- [ppm](ppm.md)
- [reverse polish notation](rpn.md) as opposed to traditional expression notation with brackets, operator precedence and other bloat
- [set theory](set_theory.md)
- [textboards](textboard.md) and [imageboards](imageboard.md) as opposed to [forums](forum.md) (no registration, no users, simple interface)
- [turing machine](turing_machine.md)
- **[ASCII](ascii.md)**: Text encoding.
- **[RGB332](rgb332.md)**, **[RGB565](rgb565.md)**: Simple [RGB](rgb.md) formats/palettes.
- **[bytebeat](bytebeat.md)**: Simple and powerful [procedural](procedural.md) music technique.
- **[farbfeld](farbfeld.md)**: [Suckless](suckless.md) image format.
- **[json](json.md)**: Simple [data](data.md) text format.
- **[lambda calculus](lambda_calculus.md)**: Minimal [functional](functional.md) language.
- **[markdown](markdown.md)**: Very simple document format.
- **[ppm](ppm.md)**: Simple image format.
- **[qoi](qio.md)**: Lossless [compression](compression.md) image format in < 1000 LOC, practically as good as [png](png.md).
- **[reverse polish notation](rpn.md)** as opposed to traditional expression notation with brackets, operator precedence and other [bloat](bloat.md).
- **[set theory](set_theory.md)**: Basis of all [mathematics](math.md).
- **[textboards](textboard.md)** and **[imageboards](imageboard.md)** as opposed to [forums](forum.md) (no registration, no users, simple interface)
- **[Turing machine](turing_machine.md)**: Minimal definition of a [computer](computer.md).

@ -34,6 +34,7 @@ There are many terms that are very similar and are sometimes used interchangeabl
- **[data structure](data_structure.md)** vs **[data type](data_type.md)**
- **[decentralized](decentralization.md)** vs **[distributed](distributed.md)**
- **[declaration](declaration.md)** vs **[definition](definition.md)**
- **[desktop environment](de.md)** vs **[window manager](wm.md)**
- **[digital](digital.md)** vs **[electronic](electronics.md)**
- **[directed acyclic graph](dag.md)** vs **[tree](tree.md)**
- **[directory](directory.md)** vs **[folder](folder.md)**

@ -2,13 +2,13 @@
*"[Micro$oft](microsoft.md) <3 open source"*
Open source (OS) is a [capitalist](capitalist_software.md) movement forked from the [free software movement](free_software.md); it is advocating "openness", sharing and collaboration in software and hardware development and though legally it is mostly identical to free (as in freedom) software, in spirit it is very different by **abandoning the goal of freedom and ethics in favor of business**, due to which we see open source as inherently evil and recommend following free software instead. [Richard Stallman](rms.md) distances himself from the open source movement. The term [FOSS](foss.md) is sometimes used to refer to both free software and open source without expressing any preference.
Open source (OS) is a [capitalist](capitalist_software.md) movement forked from the [free software movement](free_software.md); it is advocating "openness", sharing and collaboration in software and hardware development and though legally it is mostly identical to free (as in freedom) software, in spirit it is very different by **abandoning the goal of freedom and ethics in favor of business**, due to which we see open source as inherently evil and recommend following free software instead. [Richard Stallman](rms.md), the founder of free software, distances himself from the open source movement. The term [FOSS](foss.md) is sometimes used to refer to both free software and open source without expressing any preference.
Open source is becoming more prevalent than free software, as it better serves [capitalism](capitalism.md) and abuse of people, and its followers are more and more hostile towards the free software movement, which is very dangerous, ethics and focus on actual user freedom is replaced by shallow legal definitions that can be bypassed, e.g. by [capitalist software](capitalist_software.md) and [bloat monopoly](bloat_monopoly.md). In a way open source is capitalism reshaping free software so as to weaken it and eventually make its principles of freedom ineffective. In practice open source has become something akin a **brand** which is stick to a piece of software to give users with little insight a feeling they're buying into something good -- this is called **[openwashing](openwashing.md)**. This claim is greatly supported by the fact that corporations such as [Microsoft](microsoft.md), [Google](google.md) and [Mozilla](mozilla.md) widely embrace open source ("Microsoft <3 open source" and the infamous [github](github.md) acquisition).
Open source is becoming more prevalent than free software, as it better serves [capitalism](capitalism.md) and abuse of people, and its followers are more and more hostile towards the free software movement. This is very dangerous, ethics and focus on actual user freedom is replaced by shallow legal definitions that can be bypassed, e.g. by [capitalist software](capitalist_software.md) and [bloat monopoly](bloat_monopoly.md). In a way open source is capitalism reshaping free software so as to weaken it and eventually make its principles of freedom ineffective. In practice open source has become something akin a **brand** which is stick to a piece of software to give users with little insight a feeling they're buying into something good -- this is called **[openwashing](openwashing.md)**. This claim is greatly supported by the fact that corporations such as [Microsoft](microsoft.md) and [Google](google.md) widely embrace open source ("Microsoft <3 open source" and the infamous [GitHub](github.md) acquisition).
One great difference of open source with respect to free software is that **open source doesn't mind proprietary dependencies**: [Windows](windows.md) only programs or [games](game.md) in [proprietary](proprietary.md) engines such as [Unity](unity.md) are happily called open source -- this would be impossible in the context of free software because as Richard Stallman says software can only be free if it is free as a whole, it takes a single proprietary line of code to allow abuse of the user.
The open source definition is maintained by [OSI](osi.md) -- they define what exactly classifies as open source and which [licenses](license.md) are compatible with it. These licenses are mostly the same as those approved by the [FSF](fsf.md) (even though not 100%). The open source definition is a bit more complex than that of free software, in a nutshell it goes along the lines:
The open source definition is maintained by the [Open Source Initiative](osi.md) (OSI) -- they define what exactly classifies as open source and which [licenses](license.md) are compatible with it. These licenses are mostly the same as those approved by the [FSF](fsf.md) (even though not 100%). The open source definition is a bit more complex than that of free software, in a nutshell it goes along the lines:
1. The license has to allow **free redistribution** of the software without any fees.
2. **Source code must be freely available**, without any [obfuscation](obfuscation.md).

@ -0,0 +1,14 @@
# Semiconductor
{ For a physicist there's probably quite a lot of simplification, this is written from the limited point of view of a programmer. ~drummyfish }
Semiconductors are materials whose electrical conductivity varies greatly with conditions such as temperature, illumination or their purity, unlike insulators who generally don't conduct electricity very well (have a great [resistivity](resistivity.md)) and conductors who do. Semiconductors, especially [silicon](silicon.md) (Si), are the key component of [digital](digital.md) [electronic](electronic.md) [computers](computer.md) and integrated circuits. Other semiconductors include germanium, selenium or compound ones (composed of multiple elements).
Semiconductors are important for computers because they help implement the [binary](binary.md) logic circuits, they can behave like a switch that is either on (1) or off (0). Besides that they can serve e.g. for making measurements (a component whose resistivity depends on its illumination can be used to measure amount of light by measuring the resistivity). Especially important electronic components based on semiconductors are the **[diode](diode.md)** (lets current flow only one way) and **[transistor](transistor.md)** (a purely electrical "switch" that can be made extremely tiny).
Normally semiconductors don't conduct so well at room temperature (they conduct better at higher temperatures, unlike metals), but their conductivity can be increased by so called **doping** -- introducing small impurities of other elements. By doing this we can get two types of semiconductors:
- **N type**: By adding e.g. an arsenic atom to a grid of silicon atoms we get an extra free electron because arsenic has 5 outer electrons while silicon has 4. Arsenic binds its 4 electrons with neighboring silicon atoms (with so called covalent bond, sharing pairs of electrons), but will have one unbound electron, which thanks to not being bound can move easily and help conduct electricity (note that when the electron does move away, arsenic will still want to get another electron because it will become positive charged, but the fifth electron is simply always more "loose" thanks to not being bound). In this type of semiconductor we have negative particles, the **electrons**, moving around.
- **P type**: By similarly adding e.g. an boron atom to a silicon grid, we get a similar situation; boron only has 3 outer electrons, so it will only bind to 3 silicon atoms, leaving one the bond with one silicon incomplete, forming a **hole**. This hole can be seen as a [virtual](virtual.md) positively charged particle, it is simply a lack of electron. An electron can temporarily jump in this hole but will want to move away as boron doesn't want it there. In this type of semiconductor we can imagine the holes moving around (even though physically only electrons are moving, of course).
If we connect a P and N type semiconductors, we get so called **PN junction** which only conducts current one way and is used in diodes and transistors. After putting P and N materials together, at the boundary some electrons from the N type material fill the holes in the P type material which creates a small *depletion region* of certain width. This region is an electric field that's negative on the P side and positive on the N side (because negative electrons have moved from N to P). If we connect the PN junction to a voltage source, with P side to the positive and N side to the negative terminal, we create an opposite electric field which will eliminate the depletion region and allow the flow of current. Connecting the sides the other way around will result in increasing the width of the depletion region and blocking the current flow.

@ -1,5 +1,5 @@
# Software
Software (SW) are programs that run on a computer, i.e. its non-physical parts (as opposed to [hardware](hw.md)); for example an [operating system](os.md), the internet [browser](browser.md) etc.
Software (SW) are programs that run on a computer, i.e. its non-physical parts (as opposed to [hardware](hw.md)); for example an [operating system](os.md), the internet [browser](browser.md) etc. Software is created by [programming](programming.md).
Usually we can pretty clearly say what is software and what is hardware, but there are cases where it's debatable. Normally software is that about the computer which *can relatively easily be changed* (i.e. reinstalled by a typing a few commands or clicking a few buttons) while hardware is *hard-wired*, difficult to modify, and not expected or designed to be modified. Nevertheless e.g. some [firmware](firmware.md) is kind of software in form of instructions which is however many times installed in some special kind of memory that's difficult to reprogram and not expected to be reprogrammed often -- some software may be "burned in" into a circuit so that it could only be changed by physically rewiring the circuit (the ME spyware in [Intel](intel.md) [CPU](cpu.md)s has a built-in [minix](minix.md) operating system). And this is where it may sometimes be difficult to decide where the line is drawn. This issue is encountered e.g. by the [FSF](fsf.md) which certifies some hardware that works with free software as "Respects Your Privacy" (RYF), and they have very specific definition what to them classifies software.

@ -2,7 +2,7 @@
*"The Industrial Revolution and its consequences have been a disaster for the human race."* --Ted Kaczynski
Ted Kaczynski, known as a *Unabomber*, is an imprisoned American [mathematician](math.md) who lived a simple life in the nature, warned of the dangers of advanced technology and killed several people by mailing them bombs in order to bring attention to his manifesto that famously starts with the words "The Industrial Revolution and its consequences have been a disaster for the human race". Besides being one of the most famous mass murderers he is very well known in the tech community.
Ted Kaczynski, known as *Unabomber*, is an imprisoned American [mathematician](math.md) who lived a simple life in the nature, warned of the dangers of advanced technology and killed several people by mailing them bombs in order to bring attention to his manifesto that famously starts with the words "The Industrial Revolution and its consequences have been a disaster for the human race". Besides being one of the most famous mass murderers he is very well known in the tech community.
Ted was born on May 22 1942 in Chicago. As a kid he was very shy. He was also extremely smart ([IQ](iq.md) measured at 167), skipped a few grades, graduated from Harvard at 20 years old and got a [PhD](phd.md) at 25 at the University of Michigan. Then he became a professor at the University of California, until his resignation in 1969.

@ -0,0 +1,30 @@
# Transistor
Transistor is a small [semiconductor](semiconductor.md) element of [electronic](electronics.md) circuits that can be used as an amplifier or a switch, and which is a basic building block of [digital](digital.md) electronic [computers](computer.md), integrated circuits and many other electronic devices. Transistors replaced [vacuum tubes](vacuum_tube.md) and [relays](relay.md) which were used in primitive computers of the 20th century; transistors can be made much smaller, cheaper, more reliable and, unlike relays, operated purely electronically and therefore much faster. Transistor has become the most manufactured device in history.
Transistor generally has three terminals. Its key principle is that of behaving like an electronically operated amplifier or switch: we can make a transistor *open* or *close* (i.e. conduct or not conduct electricity) by applying different voltage or current (and we can also make it something between *open* and *close*). The voltage/current by which we control the transistor can be lower than that which we control, so we can see this as an amplifier: we can control high current with low current, i.e. the high current follows the low current but has higher amplitude. We can also see this as a switch: by applying voltage/current we can make a wire connect (low resistivity) or disconnect (high resistivity) similarly to a physical switch. This switch behavior is important for computers because we can exploit it to implement [binary](binary.md) (on/off) [logic circuits](logic_gate.md).
A basic division of transistors is following:
- **bipolar junction transistor (BJT)**: They have 3 terminals: **emitter**, **base** and **collector**. By applying **current** in the base we control the current between emitter and collector (this current can be greater than the control current). BJTs use both kinds of carriers at once, electrons and holes. BJTs are older than FETs, not much used in integrated circuits now.
- **PNP**: There is P semiconductor (emitter), N (base) and then P again (collector), creating 2 NP junctions. It opens when there is no current at base.
- **NPN**: The other way around that PNP (N, then P, then N). It opens when there is current at base.
- **field effect transistor (FET)**: They have 3 terminals: **source**, **gate** and **drain**. By applying **voltage** to gate we control the current between source and drain. They use only one kind of charge carriers (electrons or holes). This is due to a different internal structure from BJTs, e.g. by having gate separated from source and drain with a metal oxide layer in MOSFET. A voltage applied here kind of "pushes" the holes or electrons out of the way to create a channel between source and drain. The transistor can either be in enhancement mode (high voltage opens the transistor) or depletion mode (low voltage opens the transistor). FETs are newer and have some nicer properties, e.g. lower noise or lower power consumption: they **only consume power on state change**.
- **P channel**: Source and drain are made of P semiconductor put into an N semiconductor.
- **N channel**: Source and drain are made of N semiconductor put into a P semiconductor. They have a bit different properties from P channel FETs.
Commonly used graphical symbols for transistor are (usually in a circle):
```
E E D D
| | | |
B___|.-' B___|.-' G |--' G |--'
|'>. |'<. -->-|--. --<-|--.
| | | |
C C S S
BJT (NPN) BJT (PNP) FET (N) FET (P)
```
First FET transistors were JFETs (junction-gate FET) but by today were mostly replaced by **MOSFETs** (metal-oxide-semiconductor FET), a transistor using a metal oxide layer for separating the gate terminal which gives it some nice properties over JFET. These transistors are used to implement [logic gates](logic_gate.md) e.g. using the **[CMOS](cmos.md)** fabrication process which uses complementary pairs of P and N channel FETs so that e.g. one is always off which decreases power consumption.

@ -0,0 +1,13 @@
# Xonotic
Xonotic is a [free as in freedom](free_software.md) fast multiplayer arena [first-person-shooter](fps_game.md) [game](game.md) similar to e.g. [Quake](quake.md). It is one of the best libre games, i.e. games that are completely free by both code and data/content. It is available under [GPLv3](gpl.md). Its gameplay, graphics and customizability are amazing, it could very well be considered the best in the AFPS genre, even compared to AAA [proprietary](proprietary.md) games, which is extremely rare.
{ I've played Xonotic for years, it's really an excellent game. I've met a lot of nice people there as the players are usually programmers and people looking for [FOSS](foss.md). The gameplay is addictive and relaxing and you can have a great chat during it. Xonotic is a masterpiece. ~drummyfish }
Xonotic was forked from a game called [Nexuiz](nexuiz.md) after a trademark controversy. Nexuiz itself was created on top of liberated Quake 1 engine, so Xonotic still bears a lot Quake's legacy, however it masterfully expands on its core principles and makes the gameplay even better. For example rockets shot by rocket launcher can be guided with mouse while holding down the left button which adds a new element of skill and beautiful frag opportunities. New types of weapons were added to the classic AFPS weapons (e.g. the infamous electro, a [meme](meme.md) spamming weapon used by noobs for its forgiveness of lack of skill). Movement physics was also modified to give better air control and faster movement as a result.
As of 2022 the game has a small but pretty active community of regular players, centered mostly in Europe. There are regulars playing every day, big pros, noobs, famous spammers, campers, and nice conversations can be held during games. There are [memes](meme.md) and inside jokes. The community is pretty neat.
Better yet, the main servers have so far not been infected by the [SJW poison](tranny_software.md) and **allow a great amount of [free speech](free_speech.md)** -- another rarity. Even the game itself contains speech that SJWs would consider "offensive", there are e.g. voice lines calling other players "pussies" and even "retards". This is great.
The game can be highly customized and modded. Just like in other Quake engine games, there are many console commands (*cvars*) to alter almost anything about the game. Advanced programming can be done using [QuakeC](quakec.md). Maps can be created e.g. with [netradiant](netradiant.md).
Loading…
Cancel
Save