~exprez135/mountaen

d18d68f8b99d65189c5d459abde4671a8db62085 — Nate Ijams 11 months ago ee48e67
Updates from oscean.
M src/build.sh => src/build.sh +27 -10
@@ 1,22 1,39 @@
#!/bin/bash

# Lint
clang-format -i main.c
clang-format -i helpers.c
clang-format -i helpers.h

# Linux
# cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o main
# Cleanup
rm -f ./mountaen
rm -rf ../site
mkdir ../site

# Linux(debug)
# cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wuninitialized -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o oscean

# Linux(fast)
# cc main.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -o oscean

# RPi
# tcc -Wall main.c -o main
# tcc -Wall main.c -o oscean

# Plan9
# pcc main.c -o main
# pcc main.c -o oscean

# macOS
clang main.c -o main
# Valgrind
# gcc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wuninitialized -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og main.c -o oscean
# valgrind ./oscean

rm ../site/*
# Build Size
# echo "$(du -b ./oscean | cut -f1) bytes written"

# macOS
# clang -Wall main.c -o mountaen
gcc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wuninitialized -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o oscean 

./main
# Run
./oscean

rm ./main
# Cleanup
# rm -f ./mountaen

M src/database/glossary.ndtl => src/database/glossary.ndtl +439 -439
@@ 4,584 4,584 @@
; Dictionaries

DICTIONARY
  Parsimony : Refers to the quality of economy or frugality in the use of resources.
	Parsimony : Refers to the quality of economy or frugality in the use of resources.

PRINCIPLES
  Occam's Razor : When several theories are able to explain the same observations, Occam's razor suggests the one making the fewest assumptions.
  Kolmogorov complexity : The length of the shortest possible program to output a given object.
  Kardashev scale : A measure of a civilization's level of technological advancement based on the amount of energy used for communication.
  Levenshtein Distance : A string metric for measuring the difference between two sequences, or comparing the similarity of two words.  
  Bechdel test : A method for evaluating the portrayal of women in fiction. It asks whether a work features at least two women who talk to each other about something other than a man.
  Finkbeiner test : A checklist proposed to help journalists avoid gender bias in media articles about women in science.
  Ship of Theseus : A thought experiment that raises the question of whether an object that has had all of its components replaced remains fundamentally the same object.
  Goodhart’s law : When a measure becomes a target, it ceases to be a good measure.
	Occam's Razor : When several theories are able to explain the same observations, Occam's razor suggests the one making the fewest assumptions.
	Kolmogorov complexity : The length of the shortest possible program to output a given object.
	Kardashev scale : A measure of a civilization's level of technological advancement based on the amount of energy used for communication.
	Levenshtein Distance : A string metric for measuring the difference between two sequences, or comparing the similarity of two words.	
	Bechdel test : A method for evaluating the portrayal of women in fiction. It asks whether a work features at least two women who talk to each other about something other than a man.
	Finkbeiner test : A checklist proposed to help journalists avoid gender bias in media articles about women in science.
	Ship of Theseus : A thought experiment that raises the question of whether an object that has had all of its components replaced remains fundamentally the same object.
	Goodhart’s law : When a measure becomes a target, it ceases to be a good measure.

SPACETIME
  Entropy : Or Irreversibility, a lack of order or predictability, gradual decline into disorder.
  False Vacuum : An hypothetical vacuum(space devoid of matter) that is not entirely stable. If a small region of the universe reached a more stable vacuum, this change would spread.
  Great Filter : With no evidence of intelligent life other than ourselves, it appears that the process of starting with a star and ending with "advanced explosive lasting life" must be unlikely.
  Von Neumann probes : Or Universal Assemblers, A spacecraft capable of replicating itself.
  Final anthropic principle : Intelligent information-processing must come into existence in the Universe, and, once it comes into existence, will never die out.
  Mathematical universe hypothesis : Or Tegmark Universe, our external physical reality is a mathematical structure consisting of starting conditions with rules about how they are to evolve. Any universe that corresponds to a logically coherent mathematical object exists, but universes exist “more”(in some sense) in proportion to their underlying mathematical simplicity.
  Liminality : The quality of ambiguity, or disorientation, that occurs during a middle stage, or a threshold. Liminal places can range from borders and frontiers to crossroads and airports, which people pass through but do not live in.
  Causality : Relationship between a cause and an effect, where the effect is a direct consequence of the cause.
  Eternal Return : A theory that the universe and all existence and energy has been recurring, and will continue to recur, in a self-similar form an infinite number of times across infinite time or space.
  Super now : A type of prediction taking things that are happening now and imagining that the future will be just like now, only “more extreme.”
  Teleology : The study of things that happen for the sake of their future consequences. The fallacious meaning of it is that events are the result of future events.
  Prediction : Statement or claim that a particular event will occur in the future in more certain terms than a forecast.
  Equinox : Twice a year, around 20 March and 22 September, when daytime and nighttime are of approximately equal duration all over the planet.
  Solstice : Twice a year, when either hemisphere has the most sunlight of the year(summer solstice) or the least sunlight of the year(winter solstice) for any place other than the Equator.
	Entropy : Or Irreversibility, a lack of order or predictability, gradual decline into disorder.
	False Vacuum : An hypothetical vacuum(space devoid of matter) that is not entirely stable. If a small region of the universe reached a more stable vacuum, this change would spread.
	Great Filter : With no evidence of intelligent life other than ourselves, it appears that the process of starting with a star and ending with "advanced explosive lasting life" must be unlikely.
	Von Neumann probes : Or Universal Assemblers, A spacecraft capable of replicating itself.
	Final anthropic principle : Intelligent information-processing must come into existence in the Universe, and, once it comes into existence, will never die out.
	Mathematical universe hypothesis : Or Tegmark Universe, our external physical reality is a mathematical structure consisting of starting conditions with rules about how they are to evolve. Any universe that corresponds to a logically coherent mathematical object exists, but universes exist “more”(in some sense) in proportion to their underlying mathematical simplicity.
	Liminality : The quality of ambiguity, or disorientation, that occurs during a middle stage, or a threshold. Liminal places can range from borders and frontiers to crossroads and airports, which people pass through but do not live in.
	Causality : Relationship between a cause and an effect, where the effect is a direct consequence of the cause.
	Eternal Return : A theory that the universe and all existence and energy has been recurring, and will continue to recur, in a self-similar form an infinite number of times across infinite time or space.
	Super now : A type of prediction taking things that are happening now and imagining that the future will be just like now, only “more extreme.”
	Teleology : The study of things that happen for the sake of their future consequences. The fallacious meaning of it is that events are the result of future events.
	Prediction : Statement or claim that a particular event will occur in the future in more certain terms than a forecast.
	Equinox : Twice a year, around 20 March and 22 September, when daytime and nighttime are of approximately equal duration all over the planet.
	Solstice : Twice a year, when either hemisphere has the most sunlight of the year(summer solstice) or the least sunlight of the year(winter solstice) for any place other than the Equator.

AEROPUNK
  Compressed Air Energy Storage : A way to store energy generated at one time for use at another time using compressed air.
  Carbon Fiber Tank : Brittle and can split under sufficient stress, but creates no shrapnel when it does so. Carbon-fiber tanks safely hold air at a pressure somewhere around 4500 psi, making them comparable to steel tanks.
  Stirling Engine : A quiet heat engine that is operated by a cyclic compression and expansion and a flywheel, generating no emissions.
  The Paris Compressed Air Power Network : The city of Paris once had an extensive network for distributing power by compressed air which served more than 10,000 customers and remained in use for 100 years.
  Bicycle With Shaft : Experimental bicyle design that used a shaft connecting the crank to the back wheel instead of a drive chain.
  Rectenna : A circuit that produces a voltage by harvesting the energy from the electromagnetic fields around us trough an antenna.
  Flettner ship : A rotor ship is a type of ship designed to use a rotor sail mounted with its axis vertical. When the wind blows from the side, the Magnus effect creates a forward thrust. 
  Magnus Effect : The Magnus effect is a force acting on a spinning body in a moving airstream, which acts perpendicular to both the direction of the airstream and of the rotor axis.
  Thermoelectric generator : A device that converts temperature differencesdirectly into electrical energy through a thermoelectric phenomenon called the Seebeck effect.
	Compressed Air Energy Storage : A way to store energy generated at one time for use at another time using compressed air.
	Carbon Fiber Tank : Brittle and can split under sufficient stress, but creates no shrapnel when it does so. Carbon-fiber tanks safely hold air at a pressure somewhere around 4500 psi, making them comparable to steel tanks.
	Stirling Engine : A quiet heat engine that is operated by a cyclic compression and expansion and a flywheel, generating no emissions.
	The Paris Compressed Air Power Network : The city of Paris once had an extensive network for distributing power by compressed air which served more than 10,000 customers and remained in use for 100 years.
	Bicycle With Shaft : Experimental bicyle design that used a shaft connecting the crank to the back wheel instead of a drive chain.
	Rectenna : A circuit that produces a voltage by harvesting the energy from the electromagnetic fields around us trough an antenna.
	Flettner ship : A rotor ship is a type of ship designed to use a rotor sail mounted with its axis vertical. When the wind blows from the side, the Magnus effect creates a forward thrust. 
	Magnus Effect : The Magnus effect is a force acting on a spinning body in a moving airstream, which acts perpendicular to both the direction of the airstream and of the rotor axis.
	Thermoelectric generator : A device that converts temperature differencesdirectly into electrical energy through a thermoelectric phenomenon called the Seebeck effect.

LINGUISTICS
  Gematria : A cipher that assigns numerical value to a word, name, or phrase in the belief that words or phrases with identical numerical values bear some relation to each other.
  Palindrome : A word, number, or other sequence of characters which reads the same backward as forward.
  Ambigram : A word, art form or other symbolic representation whose elements retain meaning when viewed or interpreted from a different direction, perspective, or orientation.
  Leitmotif : A short, constantly recurring musical phrase associated with a particular person, place, or idea.
	Gematria : A cipher that assigns numerical value to a word, name, or phrase in the belief that words or phrases with identical numerical values bear some relation to each other.
	Palindrome : A word, number, or other sequence of characters which reads the same backward as forward.
	Ambigram : A word, art form or other symbolic representation whose elements retain meaning when viewed or interpreted from a different direction, perspective, or orientation.
	Leitmotif : A short, constantly recurring musical phrase associated with a particular person, place, or idea.

PSYCHOLOGY LEXICON
  Derealization : An alteration in the perception or experience of the external world so that it seems unreal.
  Solipsism syndrome : A psychological state in which a person feels that the world is not external to his or her mind.
  Qualia : Term used in philosophy to refer to individual instances of subjective, conscious experience. The pain of a headache, or the taste of wine.
  Suggestibility : A form of misattribution where ideas suggested by a questioner are mistaken for memory.
  Priming : Psychological phenomenon that consists in early stimulus influencing later thoughts and behavior.
  Confabulation : Remembering something that never actually happened.
  Salience : The perceptual quality by which an observable thing stands out relative to its environment.
  Method of loci : A method of memory enhancement which uses visualizations with the use of spatial memory to quickly and efficiently recall information.
  Hedonic Treadmill : The tendency of humans to quickly return to a relatively stable level of happiness despite major positive or negative events life changes. As a person makes more money, expectations and desires rise in tandem, which results in no permanent gain in happiness.
	Derealization : An alteration in the perception or experience of the external world so that it seems unreal.
	Solipsism syndrome : A psychological state in which a person feels that the world is not external to his or her mind.
	Qualia : Term used in philosophy to refer to individual instances of subjective, conscious experience. The pain of a headache, or the taste of wine.
	Suggestibility : A form of misattribution where ideas suggested by a questioner are mistaken for memory.
	Priming : Psychological phenomenon that consists in early stimulus influencing later thoughts and behavior.
	Confabulation : Remembering something that never actually happened.
	Salience : The perceptual quality by which an observable thing stands out relative to its environment.
	Method of loci : A method of memory enhancement which uses visualizations with the use of spatial memory to quickly and efficiently recall information.
	Hedonic Treadmill : The tendency of humans to quickly return to a relatively stable level of happiness despite major positive or negative events life changes. As a person makes more money, expectations and desires rise in tandem, which results in no permanent gain in happiness.

PERSONALITIES
  Extraversion Introversion : Represents the source and direction of a person’s energy expression. An extravert’s source and direction of energy expression is mainly in the external world, while an introvert has a source of energy mainly in their own internal world.
  Sensing Intuition : Represents the method by which someone perceives information. Sensing means that a person mainly believes information they receive directly from the external world. Intuition means that a person believes mainly information they receive from the internal or imaginative world.
  Thinking Feeling : Represents how a person processes information. Thinking means that a person makes a decision mainly through logic. Feeling means that, as a rule, they make a decision based on emotion, i.e. based on what they feel they should do.
  Judging Perceiving : Represents how a person implements the information they have processed. Judging means that a person organizes all of his life events and, as a rule, sticks to his plans. Perceiving means that they are inclined to improvise and explore alternative options.
	Extraversion Introversion : Represents the source and direction of a person’s energy expression. An extravert’s source and direction of energy expression is mainly in the external world, while an introvert has a source of energy mainly in their own internal world.
	Sensing Intuition : Represents the method by which someone perceives information. Sensing means that a person mainly believes information they receive directly from the external world. Intuition means that a person believes mainly information they receive from the internal or imaginative world.
	Thinking Feeling : Represents how a person processes information. Thinking means that a person makes a decision mainly through logic. Feeling means that, as a rule, they make a decision based on emotion, i.e. based on what they feel they should do.
	Judging Perceiving : Represents how a person implements the information they have processed. Judging means that a person organizes all of his life events and, as a rule, sticks to his plans. Perceiving means that they are inclined to improvise and explore alternative options.

SOCIOLOGY
  Philanthropy : The desire to promote the welfare of others.
  Effective Altruism : A philosophy and social movement that uses evidence and reasoning to determine the most effective ways to benefit others.
  Utilitarianism : A moral philosophy that says that what matters is the sum of everyone's well-being, or the "greatest good for the greatest number".
  Hedonism : A moral philosophy that says that the highest goal is to maximize pleasure(esp. pleasure minus pain), or that the only things that are good or bad are concious states.
  Altruism : Actions undertaken for the benefit of other people. Example: If you do something to feel good about helping people, or even to be a better person in some spiritual sense, it isn't truly altruism.
  Longtermism : A design philosophy to build products for the long term.
  Groupthink : Tendency of humans to tend to agree with each other, and hold back objections or dissent even when the group is wrong.
  
	Philanthropy : The desire to promote the welfare of others.
	Effective Altruism : A philosophy and social movement that uses evidence and reasoning to determine the most effective ways to benefit others.
	Utilitarianism : A moral philosophy that says that what matters is the sum of everyone's well-being, or the "greatest good for the greatest number".
	Hedonism : A moral philosophy that says that the highest goal is to maximize pleasure(esp. pleasure minus pain), or that the only things that are good or bad are concious states.
	Altruism : Actions undertaken for the benefit of other people. Example: If you do something to feel good about helping people, or even to be a better person in some spiritual sense, it isn't truly altruism.
	Longtermism : A design philosophy to build products for the long term.
	Groupthink : Tendency of humans to tend to agree with each other, and hold back objections or dissent even when the group is wrong.
	
BIASES
  Actor–observer bias : Tendency to overemphasize the influence of their personality and underemphasize the influence of their situation.
  Attentional bias : Tendency to neglect relevant data when making judgments of a correlation or association.
  Choice-supportive bias : Tendency to retroactively ascribing to one's choices to be more informed than they were when they were made.
  Confirmation bias : Tendency to interpret information in a way that confirms one's preconceptions.
  Congruence bias : Tendency to test hypotheses exclusively through direct testing, in contrast to tests of possible alternative hypotheses.
  Regressive bias : Tendency to remember high values and high likelihoods/probabilities/frequencies as lower than they actually were and low ones as higher than they actually were. Based on the evidence, memories are not extreme enough.
  Egocentric bias : Tendency to claim more responsibility for themselves for the results of a joint action than an outside observer would. Recalling the past in a self-serving manner. Like remembering one's exam grades as being better than they were.
  Impact bias : Tendency to overestimate the length or the intensity of the impact of future feeling states.
  Information bias : Tendency to seek information even when it cannot affect action.
  Modesty bias : Tendency to blame failures on oneself while attributing successes to situational factors, opposite of self-serving bias.
  Mood-congruent bias : Tendency to recall information congruent with one's current mood.
  Omission bias : Tendency to judge harmful actions as worse, or less moral, than equally harmful omissions.
  Self-serving bias : Tendency to attribute successes to internal characteristics while blaming failures on outside forces. It may also manifest itself as a tendency for people to evaluate ambiguous information in a way beneficial to their interests.
  Status quo bias : Tendency to like things to stay relatively the same.
  Superiority bias : Tendency to overestimating one's desirable qualities, and underestimating undesirable qualities, relative to other people. Also known as the Lake Wobegon effect.
  Survivorship bias : Tendency of focusing on what has survived to the present and ignoring what must have been lost.
  Trait ascription bias : Tendency for people to view themselves as relatively variable in terms of personality, behavior and mood while viewing others as much more predictable.
  Unit bias : Tendency to want to finish a given unit of a task or an item with strong effects on the consumption of food in particular.
  Exposure-suspicion bias : Tendency to steer the search for causes based on the knowledge of a subject's disease in a medical study.
  Stereotypical bias : Tendency to distort memories towards stereotypes. "Black-sounding" names being misremembered as names of criminals.
  Zero-risk bias : Preference for reducing a small risk to zero over a greater reduction in a larger risk.
  Authority bias : Tendency to attribute greater accuracy to the opinion of an authority figure and be more influenced by that opinion.
  Correspondence bias : Tendency to overestimate the contribution of lasting traits and dispositions, as opposed to situational effects, in determining people's behavior.
  Obsequiousness bias : Tendency to alter responses in the direction they perceive desired by the investigator.
  Unacceptability bias : Tendency of evading questions that may embarrass or invade privacy.
  Projection bias : Tendency to assume that others share the same or similar thoughts, beliefs, values, or positions.
  Consistency bias : Tendency to incorrectly remember one's past attitudes and behaviour as resembling present attitudes and behaviour.
  Hindsight bias : Tendency to see past events as predictable, based on knowledge of later events. Also known as the "I-knew-it-all-along" effect.
  Optimism bias : Tendency to be over-optimistic about the outcome of planned actions.
  Outcome bias : Tendency to judge a decision by its eventual outcome instead of based on the quality of the decision at the time it was made.
  Positive bias : Tendency to test hypotheses with positive rather than negative examples, thus risking to miss obvious disconfirming tests.
  Positive outcome bias : Tendency to overestimate the probability of good things happening to them.
	Actor–observer bias : Tendency to overemphasize the influence of their personality and underemphasize the influence of their situation.
	Attentional bias : Tendency to neglect relevant data when making judgments of a correlation or association.
	Choice-supportive bias : Tendency to retroactively ascribing to one's choices to be more informed than they were when they were made.
	Confirmation bias : Tendency to interpret information in a way that confirms one's preconceptions.
	Congruence bias : Tendency to test hypotheses exclusively through direct testing, in contrast to tests of possible alternative hypotheses.
	Regressive bias : Tendency to remember high values and high likelihoods/probabilities/frequencies as lower than they actually were and low ones as higher than they actually were. Based on the evidence, memories are not extreme enough.
	Egocentric bias : Tendency to claim more responsibility for themselves for the results of a joint action than an outside observer would. Recalling the past in a self-serving manner. Like remembering one's exam grades as being better than they were.
	Impact bias : Tendency to overestimate the length or the intensity of the impact of future feeling states.
	Information bias : Tendency to seek information even when it cannot affect action.
	Modesty bias : Tendency to blame failures on oneself while attributing successes to situational factors, opposite of self-serving bias.
	Mood-congruent bias : Tendency to recall information congruent with one's current mood.
	Omission bias : Tendency to judge harmful actions as worse, or less moral, than equally harmful omissions.
	Self-serving bias : Tendency to attribute successes to internal characteristics while blaming failures on outside forces. It may also manifest itself as a tendency for people to evaluate ambiguous information in a way beneficial to their interests.
	Status quo bias : Tendency to like things to stay relatively the same.
	Superiority bias : Tendency to overestimating one's desirable qualities, and underestimating undesirable qualities, relative to other people. Also known as the Lake Wobegon effect.
	Survivorship bias : Tendency of focusing on what has survived to the present and ignoring what must have been lost.
	Trait ascription bias : Tendency for people to view themselves as relatively variable in terms of personality, behavior and mood while viewing others as much more predictable.
	Unit bias : Tendency to want to finish a given unit of a task or an item with strong effects on the consumption of food in particular.
	Exposure-suspicion bias : Tendency to steer the search for causes based on the knowledge of a subject's disease in a medical study.
	Stereotypical bias : Tendency to distort memories towards stereotypes. "Black-sounding" names being misremembered as names of criminals.
	Zero-risk bias : Preference for reducing a small risk to zero over a greater reduction in a larger risk.
	Authority bias : Tendency to attribute greater accuracy to the opinion of an authority figure and be more influenced by that opinion.
	Correspondence bias : Tendency to overestimate the contribution of lasting traits and dispositions, as opposed to situational effects, in determining people's behavior.
	Obsequiousness bias : Tendency to alter responses in the direction they perceive desired by the investigator.
	Unacceptability bias : Tendency of evading questions that may embarrass or invade privacy.
	Projection bias : Tendency to assume that others share the same or similar thoughts, beliefs, values, or positions.
	Consistency bias : Tendency to incorrectly remember one's past attitudes and behaviour as resembling present attitudes and behaviour.
	Hindsight bias : Tendency to see past events as predictable, based on knowledge of later events. Also known as the "I-knew-it-all-along" effect.
	Optimism bias : Tendency to be over-optimistic about the outcome of planned actions.
	Outcome bias : Tendency to judge a decision by its eventual outcome instead of based on the quality of the decision at the time it was made.
	Positive bias : Tendency to test hypotheses with positive rather than negative examples, thus risking to miss obvious disconfirming tests.
	Positive outcome bias : Tendency to overestimate the probability of good things happening to them.

GROUPTHINK BIASES
  Conformity bias : Tendency to behave similarly to others in a group, even if doing so goes against your own judgment.
  Ingroup bias : Tendency to give preferential treatment to others they perceive to be members of their own groups.
  Homogeneity bias : Tendency of people to see members of their own group as being relatively more varied than members of other groups.
  Shared information bias : Tendency for group members to spend more time and energy discussing information that all members are already familiar with (i.e., shared information), and less time and energy discussing information that only some members are aware of.
  Bandwagon fallacy : Assuming that an idea has merit simply because many people believe it or practice it.
  Abilene paradox : When a group of people collectively decide on a course of action that is counter to the preferences of many or all of the individuals in the group.
  Mind Killing : Refers to a set of techniques by which an entity or a system manipulates people to act in its own interests. It does this by killing their ability to act in their own interests.
	Conformity bias : Tendency to behave similarly to others in a group, even if doing so goes against your own judgment.
	Ingroup bias : Tendency to give preferential treatment to others they perceive to be members of their own groups.
	Homogeneity bias : Tendency of people to see members of their own group as being relatively more varied than members of other groups.
	Shared information bias : Tendency for group members to spend more time and energy discussing information that all members are already familiar with (i.e., shared information), and less time and energy discussing information that only some members are aware of.
	Bandwagon fallacy : Assuming that an idea has merit simply because many people believe it or practice it.
	Abilene paradox : When a group of people collectively decide on a course of action that is counter to the preferences of many or all of the individuals in the group.
	Mind Killing : Refers to a set of techniques by which an entity or a system manipulates people to act in its own interests. It does this by killing their ability to act in their own interests.

EFFECTS
  Ambiguity effect : Tendency to avoid options for which missing information makes the probability seem "unknown".
  Bizarreness effect : Tendency to remember bizarre material better than common material.
  Bystander effect : Tendency for individuals to less likely offer help in an emergency situation when other people are present.
  Context effect : That cognition and memory are dependent on context, such that out-of-context memories are more difficult to retrieve than in-context memories.
  Example : Recall time and accuracy for a work-related memory will be lower at home, and vice versa.
  Contrast effect : Enhancement or diminishment of a weight or other measurement when compared with recently observed contrasting object.
  Cross-race effect : Tendency for people of one race to have difficulty identifying members of a race other than their own.
  Dunning-kruger effect : When people are incompetent in the strategies they adopt to achieve success and satisfaction, they suffer a dual burden, not only do they reach erroneous conclusions and make unfortunate choices, but their incompetence robs them of the ability to realize it. Instead, they are left with the mistaken impression that they are doing just fine.
  False consensus effect : Tendency for people to overestimate the degree to which others agree with them.
  Forer effect : Tendency to give high accuracy ratings to descriptions of their personality that supposedly are tailored specifically for them, but are in fact vague and general enough to apply to a wide range of people. Also known as the Barnum Effect. Like Horoscopes.
  Motivated cognition : Tendency to process information toward conclusions that suit some end or goal.
  Generation effect : That self-generated information is remembered best. People are better able to recall memories of statements that they have generated than similar statements generated by others.
  Google effect : Tendency to forget information that can be found readily online by using Internet search engines.
  Halo effect : Tendency for a person's positive or negative traits to "spill over" from one area of their personality to another in others' perceptions of them.
  Hostile media effect : Tendency to perceive news coverage as biased against your position on an issue.
  Humor effect : That humorous items are more easily remembered than non-humorous ones, which might be explained by the distinctiveness of humor, the increased cognitive processing time to understand the humor, or the emotional arousal caused by the humor.
  Lake wobegon effect : Tendency to report flattering beliefs about oneself and believe that one is above average.
  List-length effect : A smaller percentage of items are remembered in a longer list, but as the length of the list increases, the absolute number of items remembered increases as well.
  Mere exposure effect : Tendency to express undue liking for things merely because they are familiar with them.
  Misinformation effect : Memory becoming less accurate because of interference from post-event information.
  Modality effect : That memory recall is higher for the last items of a list when the list items were received via speech than when they were received through writing.
  Overconfidence effect : Tendency of being more certain than is justified, given your priors and the evidence available.
  Part-list cueing effect : That being shown some items from a list and later retrieving one item causes it to become harder to retrieve the other items.
  Picture superiority effect : The notion that concepts that are learned by viewing pictures are more easily and frequently recalled than are concepts that are learned by viewing their written word form counterparts.
  Positivity effect : That older adults favor positive over negative information in their memories.
  Primacy effect : Tendency to weigh initial events more than subsequent events.
  Processing effect : That information that takes longer to read, and is processed with more difficulty, is more easily remembered.
  Pseudocertainty effect : Tendency to make risk-averse choices if the expected outcome is positive, but make risk-seeking choices to avoid negative outcomes.
  Recency effect : Tendency to weigh recent events more than earlier events.
  Self-relevance effect : That memories relating to the self are better recalled than similar information relating to others.
  Spacing effect : That information is better recalled if exposure to it is repeated over a long span of time rather than a short one.
  Spotlight effect : Tendency to overestimate the amount that other people notice your appearance or behavior.
  Subadditivity effect : Tendency to judge probability of the whole to be less than the probabilities of the parts.
  Suffix effect : Diminishment of the recency effect because a sound item is appended to the list that the subject is not required to recall.
  Telescoping effect : Tendency to perceive recent events to have occurred more remotely and remote events appear to have occurred more recently.
  Testing effect : The fact that you more easily remember information you have read by rewriting it instead of rereading it.
  Underconfidence effect : State of being more uncertain than is justified, given your priors and the evidence you are aware of.
  Verbatim effect : That the "gist" of what someone has said is better remembered than the verbatim wording. This is because memories are representations, not exact copies.
  Von restorff effect : Tendency to remember an item that "stands out like a sore thumb", more than other items.
  Zeigarnik effect : That uncompleted or interrupted tasks are remembered better than completed ones.
  Focusing effect : Tendency of placing too much importance on one aspect of an event, causes error in accurately predicting the utility of a future outcome.
  Endowment effect : Tendency to demand much more to give up an object than they would be willing to pay to acquire it.
  Next-in-line effect : That a person in a group has diminished recall for the words of others who spoke immediately before himself, if they take turns speaking.
  Matthew Effect : Whoever has will be given more, whoever does not have, even what they have will be taken from them.
	Ambiguity effect : Tendency to avoid options for which missing information makes the probability seem "unknown".
	Bizarreness effect : Tendency to remember bizarre material better than common material.
	Bystander effect : Tendency for individuals to less likely offer help in an emergency situation when other people are present.
	Context effect : That cognition and memory are dependent on context, such that out-of-context memories are more difficult to retrieve than in-context memories.
	Example : Recall time and accuracy for a work-related memory will be lower at home, and vice versa.
	Contrast effect : Enhancement or diminishment of a weight or other measurement when compared with recently observed contrasting object.
	Cross-race effect : Tendency for people of one race to have difficulty identifying members of a race other than their own.
	Dunning-kruger effect : When people are incompetent in the strategies they adopt to achieve success and satisfaction, they suffer a dual burden, not only do they reach erroneous conclusions and make unfortunate choices, but their incompetence robs them of the ability to realize it. Instead, they are left with the mistaken impression that they are doing just fine.
	False consensus effect : Tendency for people to overestimate the degree to which others agree with them.
	Forer effect : Tendency to give high accuracy ratings to descriptions of their personality that supposedly are tailored specifically for them, but are in fact vague and general enough to apply to a wide range of people. Also known as the Barnum Effect. Like Horoscopes.
	Motivated cognition : Tendency to process information toward conclusions that suit some end or goal.
	Generation effect : That self-generated information is remembered best. People are better able to recall memories of statements that they have generated than similar statements generated by others.
	Google effect : Tendency to forget information that can be found readily online by using Internet search engines.
	Halo effect : Tendency for a person's positive or negative traits to "spill over" from one area of their personality to another in others' perceptions of them.
	Hostile media effect : Tendency to perceive news coverage as biased against your position on an issue.
	Humor effect : That humorous items are more easily remembered than non-humorous ones, which might be explained by the distinctiveness of humor, the increased cognitive processing time to understand the humor, or the emotional arousal caused by the humor.
	Lake wobegon effect : Tendency to report flattering beliefs about oneself and believe that one is above average.
	List-length effect : A smaller percentage of items are remembered in a longer list, but as the length of the list increases, the absolute number of items remembered increases as well.
	Mere exposure effect : Tendency to express undue liking for things merely because they are familiar with them.
	Misinformation effect : Memory becoming less accurate because of interference from post-event information.
	Modality effect : That memory recall is higher for the last items of a list when the list items were received via speech than when they were received through writing.
	Overconfidence effect : Tendency of being more certain than is justified, given your priors and the evidence available.
	Part-list cueing effect : That being shown some items from a list and later retrieving one item causes it to become harder to retrieve the other items.
	Picture superiority effect : The notion that concepts that are learned by viewing pictures are more easily and frequently recalled than are concepts that are learned by viewing their written word form counterparts.
	Positivity effect : That older adults favor positive over negative information in their memories.
	Primacy effect : Tendency to weigh initial events more than subsequent events.
	Processing effect : That information that takes longer to read, and is processed with more difficulty, is more easily remembered.
	Pseudocertainty effect : Tendency to make risk-averse choices if the expected outcome is positive, but make risk-seeking choices to avoid negative outcomes.
	Recency effect : Tendency to weigh recent events more than earlier events.
	Self-relevance effect : That memories relating to the self are better recalled than similar information relating to others.
	Spacing effect : That information is better recalled if exposure to it is repeated over a long span of time rather than a short one.
	Spotlight effect : Tendency to overestimate the amount that other people notice your appearance or behavior.
	Subadditivity effect : Tendency to judge probability of the whole to be less than the probabilities of the parts.
	Suffix effect : Diminishment of the recency effect because a sound item is appended to the list that the subject is not required to recall.
	Telescoping effect : Tendency to perceive recent events to have occurred more remotely and remote events appear to have occurred more recently.
	Testing effect : The fact that you more easily remember information you have read by rewriting it instead of rereading it.
	Underconfidence effect : State of being more uncertain than is justified, given your priors and the evidence you are aware of.
	Verbatim effect : That the "gist" of what someone has said is better remembered than the verbatim wording. This is because memories are representations, not exact copies.
	Von restorff effect : Tendency to remember an item that "stands out like a sore thumb", more than other items.
	Zeigarnik effect : That uncompleted or interrupted tasks are remembered better than completed ones.
	Focusing effect : Tendency of placing too much importance on one aspect of an event, causes error in accurately predicting the utility of a future outcome.
	Endowment effect : Tendency to demand much more to give up an object than they would be willing to pay to acquire it.
	Next-in-line effect : That a person in a group has diminished recall for the words of others who spoke immediately before himself, if they take turns speaking.
	Matthew Effect : Whoever has will be given more, whoever does not have, even what they have will be taken from them.

FALLACIES
  Conjunction fallacy : Assumption that specific conditions are more probable than general ones.
  Detached lever fallacy : Assumption that something simple for one system will be simple for others.
  Gambler's fallacy : Assumption that individual random events are influenced by previous random events. Example: I've flipped heads with this coin five times consecutively, so the chance of tails coming out on the sixth flip is much greater than heads.
  Mind projection fallacy : Assumption that the way you see the world reflects the way the world really is.
  Typical mind fallacy : Assumption that other people are more like you than they actually are.
  Fallacy of gray : Assumption that because nothing is certain, everything is equally uncertain. It does not take into account that some things are more certain than others.
  The Sophisticate : "The world isn't black and white. No one does pure good or pure bad. Therefore, no one is better than anyone else." The Zetet: "Knowing only gray, you conclude that all grays are the same shade. You mock the simplicity of the two-color view, yet you replace it with a one-color view."
  Planning fallacy : Underestimating task-completion times.
  Sunk cost fallacy : Letting past investments interfere with decision-making in the present.
  Giant cheesecake fallacy : Occurs when an argument leaps directly from capability to actuality, without considering the necessary intermediate of motive.
  Narrative fallacy : A vulnerability to over-interpretation and our predilection for compact stories over raw truths.
  Scales of justice fallacy : Error of using a simple polarized scheme for deciding a complex issue/ each piece of evidence about the question is individually categorized as supporting exactly one of the two opposing positions.
  Top 1% fallacy : Related to not taking into account the idea that a small sample size is not always reflective of a whole population and that sample populations with certain characteristics, e.g. made up of repeat job seekers, are not reflective of the whole population.
  Fallacy of relative privation : Error of thinking that if something is worse than the problem currently being discussed, then the problem currently being discussed isn't that important at all. In other words: nothing matters if it's not literally the worst thing happening
  Toupée fallacy : All toupées look fake, I've never seen one that I couldn't tell was fake.
	Conjunction fallacy : Assumption that specific conditions are more probable than general ones.
	Detached lever fallacy : Assumption that something simple for one system will be simple for others.
	Gambler's fallacy : Assumption that individual random events are influenced by previous random events. Example: I've flipped heads with this coin five times consecutively, so the chance of tails coming out on the sixth flip is much greater than heads.
	Mind projection fallacy : Assumption that the way you see the world reflects the way the world really is.
	Typical mind fallacy : Assumption that other people are more like you than they actually are.
	Fallacy of gray : Assumption that because nothing is certain, everything is equally uncertain. It does not take into account that some things are more certain than others.
	The Sophisticate : "The world isn't black and white. No one does pure good or pure bad. Therefore, no one is better than anyone else." The Zetet: "Knowing only gray, you conclude that all grays are the same shade. You mock the simplicity of the two-color view, yet you replace it with a one-color view."
	Planning fallacy : Underestimating task-completion times.
	Sunk cost fallacy : Letting past investments interfere with decision-making in the present.
	Giant cheesecake fallacy : Occurs when an argument leaps directly from capability to actuality, without considering the necessary intermediate of motive.
	Narrative fallacy : A vulnerability to over-interpretation and our predilection for compact stories over raw truths.
	Scales of justice fallacy : Error of using a simple polarized scheme for deciding a complex issue/ each piece of evidence about the question is individually categorized as supporting exactly one of the two opposing positions.
	Top 1% fallacy : Related to not taking into account the idea that a small sample size is not always reflective of a whole population and that sample populations with certain characteristics, e.g. made up of repeat job seekers, are not reflective of the whole population.
	Fallacy of relative privation : Error of thinking that if something is worse than the problem currently being discussed, then the problem currently being discussed isn't that important at all. In other words: nothing matters if it's not literally the worst thing happening
	Toupée fallacy : All toupées look fake, I've never seen one that I couldn't tell was fake.

ILLUSIONS
  Asymmetric insight : Tendency to perceive the knowledge of their peers to surpass their peers' knowledge of them.
  Control : Tendency to believe they can control or at least influence outcomes that they clearly cannot.
  External agency : Tendency to perceive self-generated preferences as instead being caused by insightful, effective and benevolent agents.
  Truth effect : Tendency to identify as true statements familiar statements over unfamiliar ones.
  Clustering : Tendency to perceive patterns where actually none exist.
  Frequency : Tendency to notice something everywhere after having learnt about it. Also known as the Baader-Meinhof Phenomenon.
  Transparency : Tendency to overestimate others' ability to know them, and they also overestimate their ability to know others. Misleading impression that your words convey more to others than they really do.
  Anti-inductiveness : The idea that the market would stop being efficient if everyone acted like it already was efficient. For example, a vote in a democracy, the more people that believe their vote counts towards the outcome of an election, the less their votes count.  Also known as the Reverse Tinkerbell effect.
  Anti-epistemology : Bad explicit beliefs about rules of reasoning, usually developed in the course of protecting an existing false belief
	Asymmetric insight : Tendency to perceive the knowledge of their peers to surpass their peers' knowledge of them.
	Control : Tendency to believe they can control or at least influence outcomes that they clearly cannot.
	External agency : Tendency to perceive self-generated preferences as instead being caused by insightful, effective and benevolent agents.
	Truth effect : Tendency to identify as true statements familiar statements over unfamiliar ones.
	Clustering : Tendency to perceive patterns where actually none exist.
	Frequency : Tendency to notice something everywhere after having learnt about it. Also known as the Baader-Meinhof Phenomenon.
	Transparency : Tendency to overestimate others' ability to know them, and they also overestimate their ability to know others. Misleading impression that your words convey more to others than they really do.
	Anti-inductiveness : The idea that the market would stop being efficient if everyone acted like it already was efficient. For example, a vote in a democracy, the more people that believe their vote counts towards the outcome of an election, the less their votes count.	Also known as the Reverse Tinkerbell effect.
	Anti-epistemology : Bad explicit beliefs about rules of reasoning, usually developed in the course of protecting an existing false belief

PHILOSOPHY
  Ontology : The topic concerning the nature of being.
  Gestalt : The conscious experience must be considered globally, as having a reality of its own, independent of the parts.
  Dasein : German word for 'existence', literally meaning 'being there'.
  Deliberate practice : Focused, consistent and goal-oriented training. It favours quality over quantity. It knows not all practice is created equal.
  Perfect Duty : Perfect duties are duties that are blameworthy if not met, as they are a basic required duty for a human being.
  Maxim : A concise expression of a fundamental moral rule or principle.
  Hermeneutics : The branch of knowledge that deals with interpretation.
  Ubermensch : The one who seeks out hardship and creates new values.
  The Last Man : The one who seeks comfort and alms.
  Saudade : A deep emotional state of nostalgic or profound melancholic longing for an absent something or someone that one loves. Saudade was once described as "the love that remains" after someone is gone.
  Wabisabi : Acknowledgement that nothing lasts, nothing is finished, and that nothing is perfect.
	Ontology : The topic concerning the nature of being.
	Gestalt : The conscious experience must be considered globally, as having a reality of its own, independent of the parts.
	Dasein : German word for 'existence', literally meaning 'being there'.
	Deliberate practice : Focused, consistent and goal-oriented training. It favours quality over quantity. It knows not all practice is created equal.
	Perfect Duty : Perfect duties are duties that are blameworthy if not met, as they are a basic required duty for a human being.
	Maxim : A concise expression of a fundamental moral rule or principle.
	Hermeneutics : The branch of knowledge that deals with interpretation.
	Ubermensch : The one who seeks out hardship and creates new values.
	The Last Man : The one who seeks comfort and alms.
	Saudade : A deep emotional state of nostalgic or profound melancholic longing for an absent something or someone that one loves. Saudade was once described as "the love that remains" after someone is gone.
	Wabisabi : Acknowledgement that nothing lasts, nothing is finished, and that nothing is perfect.

GREEN ANARCHISM
  Health : A state of complete physical, mental and social well-being and not merely the absence of disease or infirmity.
  Dark Greens : The ones who believe that environmental problems are an inherent part of industrialized civilization, and seek radical political change.
  Light Greens : The ones who see protecting the environment first and foremost as a personal responsibility, focusing on environmentalism as a lifestyle choice.
  Veganism : A philosophy and way of living which seeks to prevent all forms of exploitation of, and cruelty to, other animals for food, clothing or any other purpose.
  Ecofeminism : Ecofeminist thinkers draw on the concept of gender to theorize on the relationship between humans and the natural world.
	Health : A state of complete physical, mental and social well-being and not merely the absence of disease or infirmity.
	Dark Greens : The ones who believe that environmental problems are an inherent part of industrialized civilization, and seek radical political change.
	Light Greens : The ones who see protecting the environment first and foremost as a personal responsibility, focusing on environmentalism as a lifestyle choice.
	Veganism : A philosophy and way of living which seeks to prevent all forms of exploitation of, and cruelty to, other animals for food, clothing or any other purpose.
	Ecofeminism : Ecofeminist thinkers draw on the concept of gender to theorize on the relationship between humans and the natural world.

ANIMAL RIGHTS
  Animal Rights : Refers to the position that the interests of nonhuman animals, including their interest in not suffering, should be afforded the same consideration as the interests of humans and that nonhuman animals have rights and inherent value independent of their usefulness to humans.
  Animal Liberation Front : An international, leaderless resistance that engages in removing animals from laboratories and farms, destroying facilities, arranging safe houses and veterinary care, and operating sanctuaries where the animals subsequently live.
  Animal Advocacy : Promotion of the interests of animals, generally. Includes work for animal rights and animal welfare.
  Commodification : The conversion of a living being, principle, or natural environment into an "object" that is used, exchanged, or consumed for profit or other desired gain.
  Speciesism : Discrimination on the basis of species, oppression and judgment of an animal on the basis of that animal's species or that animal's non-membership in a species. The belief in human superiority over other animals or certain nonhuman animals' superiority over others.
  Debarking : The surgical removal and manipulation of tissue in a dog's vocal cords to drastically quiet his or her natural bark. Debarking does not address the underlying reasons that a dog may be barking excessively, and the dog will continue to bark, albeit more quietly or silently.
  Draize Test : Infamous and excruciating eye-irritation test for household products and cosmetics in which drops of a substance are placed in the eyes of rabbits, causing the animals ulcers, blindness, and other injuries before they are ultimately killed.
  Flowerpot Technique : A technique used in sleep deprivation studies designed to allow NREM sleep but prevent REM sleep.
  Forced Molting : The egg-industry practice of artificially inducing hens to molt by depriving them of food for several days to two weeks when their egg production has declined.
  Rape Rack : The industry term referring to the contraptions in which cows and pigs are restrained while they are forcibly inseminated.
  Veal Crate : Small crate in which a calf being raised for veal is confined and tied up. The calf's movement within the crate is intentionally restricted to limit the strengthening of muscle, and an insufficient diet is provided intentionally to keep the cow anemic.
	Animal Rights : Refers to the position that the interests of nonhuman animals, including their interest in not suffering, should be afforded the same consideration as the interests of humans and that nonhuman animals have rights and inherent value independent of their usefulness to humans.
	Animal Liberation Front : An international, leaderless resistance that engages in removing animals from laboratories and farms, destroying facilities, arranging safe houses and veterinary care, and operating sanctuaries where the animals subsequently live.
	Animal Advocacy : Promotion of the interests of animals, generally. Includes work for animal rights and animal welfare.
	Commodification : The conversion of a living being, principle, or natural environment into an "object" that is used, exchanged, or consumed for profit or other desired gain.
	Speciesism : Discrimination on the basis of species, oppression and judgment of an animal on the basis of that animal's species or that animal's non-membership in a species. The belief in human superiority over other animals or certain nonhuman animals' superiority over others.
	Debarking : The surgical removal and manipulation of tissue in a dog's vocal cords to drastically quiet his or her natural bark. Debarking does not address the underlying reasons that a dog may be barking excessively, and the dog will continue to bark, albeit more quietly or silently.
	Draize Test : Infamous and excruciating eye-irritation test for household products and cosmetics in which drops of a substance are placed in the eyes of rabbits, causing the animals ulcers, blindness, and other injuries before they are ultimately killed.
	Flowerpot Technique : A technique used in sleep deprivation studies designed to allow NREM sleep but prevent REM sleep.
	Forced Molting : The egg-industry practice of artificially inducing hens to molt by depriving them of food for several days to two weeks when their egg production has declined.
	Rape Rack : The industry term referring to the contraptions in which cows and pigs are restrained while they are forcibly inseminated.
	Veal Crate : Small crate in which a calf being raised for veal is confined and tied up. The calf's movement within the crate is intentionally restricted to limit the strengthening of muscle, and an insufficient diet is provided intentionally to keep the cow anemic.

ADAPTATION
  Uncivilisation : It is to accept the world for what it is and to make our home here, rather than dreaming of relocating to the stars, or existing in a Man-forged bubble and pretending to ourselves that there is nothing outside it to which we have any connection at all.
  Dark Mountaineers : Artists who generally ascribe to the idea that climate collapse cannot be stopped or reversed, a forum in which one can be honest about their sense of dread and loss.
  Inhumanism : A shifting of emphasis and significance from man to not-man, the rejection of human solipsism and recognition of the transhuman magnificence.
  Anthropocene : A proposed epoch dating from the commencement of significant human impact on Earth's geology and ecosystems, including, but not limited to, anthropogenic climate change.
  Simple pastoral : Merely another of our many vehicles of escape from reality, that doesn’t interrogate civilisation's main driving forces, but instead focuses on returning to rural simplicity.
  Object Oriented Ontology : A school of thought that rejects the privileging of human existence over the existence of nonhuman objects, that objects exist independently of human perception and are not ontologically exhausted by their relations with humans.
  Freudian death drive : The hypothesis of a death instinct, the task of which is to lead organic life back into the inanimate state.
  Agrilogistics paradox : A maniacal urge to live, and to diminish stimulation, that ends up being self-destructive, generating mass extinction, through global warming, that it was designed to avoid.
  Existential Risk : An event that could cause human extinction or permanently and drastically curtail humanity's potential.
  Strong Longtermism : The primary determinant of the value of our actions is the effects of those actions on the very long-run future.
  The Hinge of History Hypothesis : The hypothese that we are living at the most influential time ever.
  Negative Emissions : Divided into “natural” and “technological”  categories, these strategies aim to remove carbon from the atmosphere, however, there remains no evidence that either branch is feasible despite their inclusion in climate modeling. The large majority of IPCC models (344/400 as of 2019) feature theoretical negative emissions.
  Carbon Capture : A technological negative emissions solution that aims to remove carbon from the air, storing it as inert material. Small units exist at high cost, and it remains unclear whether large scale deployment is possible or desirable.
  Carbon Budget : An attempt to provide the world with a means of tracking emissions with goals set based on projected temperature rise. Most models are not believed to accurately account for feedback loops.
  Feedback Loops : The results of global warming are complex. Much of the destruction caused by warming also contributes: the albedo effect, forest fires, melting ice, and ocean acidification all mean more greenhouse gases and less places for carbon to go. It remains unclear how these systems will interact with ongoing anthropogenic warming.
  Albedo Effect : Warming caused by the disappearance of ice which previously reflect heat back into space.
  Solar Radiation Management : Methods of reducing global temperature by increasing albedo, frequently discussed methods include stratospheric sulphur injection and marine cloud brightening.
  Scientific Reticence : A phenomenon where scientists failed to emphasize many the more dramatic results of the study of global warming over concerns of reception.
  Fossil Capitalism : A theory suggesting the modern economy is actually just a system that runs on fossil fuel.
  Tragedy of the Commons : A situation in a shared-resource system where individual users, acting independently according to their own self-interest, behave contrary to the common good of all users by depleting or spoiling the shared resource through their collective action.
	Uncivilisation : It is to accept the world for what it is and to make our home here, rather than dreaming of relocating to the stars, or existing in a Man-forged bubble and pretending to ourselves that there is nothing outside it to which we have any connection at all.
	Dark Mountaineers : Artists who generally ascribe to the idea that climate collapse cannot be stopped or reversed, a forum in which one can be honest about their sense of dread and loss.
	Inhumanism : A shifting of emphasis and significance from man to not-man, the rejection of human solipsism and recognition of the transhuman magnificence.
	Anthropocene : A proposed epoch dating from the commencement of significant human impact on Earth's geology and ecosystems, including, but not limited to, anthropogenic climate change.
	Simple pastoral : Merely another of our many vehicles of escape from reality, that doesn’t interrogate civilisation's main driving forces, but instead focuses on returning to rural simplicity.
	Object Oriented Ontology : A school of thought that rejects the privileging of human existence over the existence of nonhuman objects, that objects exist independently of human perception and are not ontologically exhausted by their relations with humans.
	Freudian death drive : The hypothesis of a death instinct, the task of which is to lead organic life back into the inanimate state.
	Agrilogistics paradox : A maniacal urge to live, and to diminish stimulation, that ends up being self-destructive, generating mass extinction, through global warming, that it was designed to avoid.
	Existential Risk : An event that could cause human extinction or permanently and drastically curtail humanity's potential.
	Strong Longtermism : The primary determinant of the value of our actions is the effects of those actions on the very long-run future.
	The Hinge of History Hypothesis : The hypothese that we are living at the most influential time ever.
	Negative Emissions : Divided into “natural” and “technological”  categories, these strategies aim to remove carbon from the atmosphere, however, there remains no evidence that either branch is feasible despite their inclusion in climate modeling. The large majority of IPCC models (344/400 as of 2019) feature theoretical negative emissions.
	Carbon Capture : A technological negative emissions solution that aims to remove carbon from the air, storing it as inert material. Small units exist at high cost, and it remains unclear whether large scale deployment is possible or desirable.
	Carbon Budget : An attempt to provide the world with a means of tracking emissions with goals set based on projected temperature rise. Most models are not believed to accurately account for feedback loops.
	Feedback Loops : The results of global warming are complex. Much of the destruction caused by warming also contributes: the albedo effect, forest fires, melting ice, and ocean acidification all mean more greenhouse gases and less places for carbon to go. It remains unclear how these systems will interact with ongoing anthropogenic warming.
	Albedo Effect : Warming caused by the disappearance of ice which previously reflect heat back into space.
	Solar Radiation Management : Methods of reducing global temperature by increasing albedo, frequently discussed methods include stratospheric sulphur injection and marine cloud brightening.
	Scientific Reticence : A phenomenon where scientists failed to emphasize many the more dramatic results of the study of global warming over concerns of reception.
	Fossil Capitalism : A theory suggesting the modern economy is actually just a system that runs on fossil fuel.
	Tragedy of the Commons : A situation in a shared-resource system where individual users, acting independently according to their own self-interest, behave contrary to the common good of all users by depleting or spoiling the shared resource through their collective action.

RECYCLISM
  Electronics right to repair : A government legislation intended to allow consumers the ability to repair and modify their own electronics, where otherwise the manufacturer of such devices require the consumer to use only their offered services.
  Obsolescence of desirability : When designers change the styling of products so customers will purchase products more frequently due to the decrease in the perceived desirability of unfashionable items.
  Obsolescence of function : When an item is produced to break down or otherwise become non-functional in an abnormally short period of time.
  Obsolescence of compatibility : When a product becomes obsolete by altering the system in which it is used in such a way as to make its continued use difficult. Common examples of planned systemic obsolescence include not accommodating forward compatibility in software.
  Pseudo-obsolescence of desirability : When planned obsolescence appears to introduce innovative changes into a product, but in reality does not, often forcibly outfashioning an otherwise-useful product.
  Non-user-replaceable batteries : Some products, such as mobile phones, laptops, and electric toothbrushes, contain batteries that are not replaceable by the end-user after they have worn down, therefore leaving an aging battery trapped inside the device.
  Phoebus cartel : The cartel conveniently lowered operational costs and worked to standardize the life expectancy of light bulbs at 1,000 hours, down from 2,500 hours, and raised prices without fear of competition. 
	Electronics right to repair : A government legislation intended to allow consumers the ability to repair and modify their own electronics, where otherwise the manufacturer of such devices require the consumer to use only their offered services.
	Obsolescence of desirability : When designers change the styling of products so customers will purchase products more frequently due to the decrease in the perceived desirability of unfashionable items.
	Obsolescence of function : When an item is produced to break down or otherwise become non-functional in an abnormally short period of time.
	Obsolescence of compatibility : When a product becomes obsolete by altering the system in which it is used in such a way as to make its continued use difficult. Common examples of planned systemic obsolescence include not accommodating forward compatibility in software.
	Pseudo-obsolescence of desirability : When planned obsolescence appears to introduce innovative changes into a product, but in reality does not, often forcibly outfashioning an otherwise-useful product.
	Non-user-replaceable batteries : Some products, such as mobile phones, laptops, and electric toothbrushes, contain batteries that are not replaceable by the end-user after they have worn down, therefore leaving an aging battery trapped inside the device.
	Phoebus cartel : The cartel conveniently lowered operational costs and worked to standardize the life expectancy of light bulbs at 1,000 hours, down from 2,500 hours, and raised prices without fear of competition. 

BELIEFS
  Belief : The mental state in which an individual holds a proposition to be true.
  Priors : The beliefs an agent holds regarding a fact, hypothesis or consequence, before being presented with evidence.
  Alief : An independent source of emotional reaction which can coexist with a contradictory belief. Example The fear felt when a monster jumps out of the darkness in a scary movie is based on the alief that the monster is about to attack you, even though you believe that it cannot.
  Proper belief : Requires observations, gets updated upon encountering new evidence, and provides practical benefit in anticipated experience.
  Improper belief : Is a belief that isn't concerned with describing the territory. Note that the fact that a belief just happens to be true doesn't mean you're right to have it. If you buy a lottery ticket, certain that it's a winning ticket (for no reason), and it happens to be, believing that was still a mistake.
  Belief in belief : Where it is difficult to believe a thing, it is often much easier to believe that you ought to believe it. Were you to really believe and not just believe in belief, the consequences of error would be much more severe. When someone makes up excuses in advance, it would seem to require that belief, and belief in belief, have become unsynchronized.
  A Priori : Knowledge which we can be sure of without any empirical evidence(evidence from our senses). So, knowledge that you could realize if you were just a mind floating in a void unconnected to a body.
	Belief : The mental state in which an individual holds a proposition to be true.
	Priors : The beliefs an agent holds regarding a fact, hypothesis or consequence, before being presented with evidence.
	Alief : An independent source of emotional reaction which can coexist with a contradictory belief. Example The fear felt when a monster jumps out of the darkness in a scary movie is based on the alief that the monster is about to attack you, even though you believe that it cannot.
	Proper belief : Requires observations, gets updated upon encountering new evidence, and provides practical benefit in anticipated experience.
	Improper belief : Is a belief that isn't concerned with describing the territory. Note that the fact that a belief just happens to be true doesn't mean you're right to have it. If you buy a lottery ticket, certain that it's a winning ticket (for no reason), and it happens to be, believing that was still a mistake.
	Belief in belief : Where it is difficult to believe a thing, it is often much easier to believe that you ought to believe it. Were you to really believe and not just believe in belief, the consequences of error would be much more severe. When someone makes up excuses in advance, it would seem to require that belief, and belief in belief, have become unsynchronized.
	A Priori : Knowledge which we can be sure of without any empirical evidence(evidence from our senses). So, knowledge that you could realize if you were just a mind floating in a void unconnected to a body.

ARGUMENTS
  Ad baculum : Argument relying on an appeal to fear or a threat.
  Ad ignorantiam : Argument relying on people's ignorance.
  Ad populum : Argument relying on sentimental weakness.
  Ad verecundiam : Argument relying on the the words of an "expert", or authority.
  Ex silentio : Argument relying on ignorance.
  Ex nihilo : An argument that bears no relation to the previous topic of discussion.
  Non sequitur : An inference that does not follow from established premises or evidence.
	Ad baculum : Argument relying on an appeal to fear or a threat.
	Ad ignorantiam : Argument relying on people's ignorance.
	Ad populum : Argument relying on sentimental weakness.
	Ad verecundiam : Argument relying on the the words of an "expert", or authority.
	Ex silentio : Argument relying on ignorance.
	Ex nihilo : An argument that bears no relation to the previous topic of discussion.
	Non sequitur : An inference that does not follow from established premises or evidence.

RESPONSES
  Akrasia : State of acting against one's better judgment.
  Connotation : Emotional association with a word.
  Intransigence : Refusal to change one's views or to agree about something.
  Inferential distance : Gap between the background knowledge and epistemology of a person trying to explain an idea, and the background knowledge and epistemology of the person trying to understand it.
  Straw man : Creating a false or made up scenario and then attacking it. Painting your opponent with false colors only deflects the purpose of the argument.
  Steel man : To steelman is to address the strongest possible variant or the most charitable interpretation of an idea, rather than the most available phrasings.
  Red herring : A diversion from the active topic.
  Rationalization : Starts from a conclusion, and then works backward to arrive at arguments apparently favouring that conclusion. Rationalization argues for a side already selected.
  Dogpiling : A disagreement wherein one person says something wrong or offensive, and a large number of people comment in response to tell them how wrong they are, and continue to disparage the original commenter beyond any reasonable time limit.
  Grandstanding : An action that is intended to make people notice and admire you, behaving in a way that makes people pay attention to you instead of thinking about more important matters.
  Whataboutism : An attempt to discredit an opponent's position by charging them with hypocrisy without directly refuting or disproving their argument.
	Akrasia : State of acting against one's better judgment.
	Connotation : Emotional association with a word.
	Intransigence : Refusal to change one's views or to agree about something.
	Inferential distance : Gap between the background knowledge and epistemology of a person trying to explain an idea, and the background knowledge and epistemology of the person trying to understand it.
	Straw man : Creating a false or made up scenario and then attacking it. Painting your opponent with false colors only deflects the purpose of the argument.
	Steel man : To steelman is to address the strongest possible variant or the most charitable interpretation of an idea, rather than the most available phrasings.
	Red herring : A diversion from the active topic.
	Rationalization : Starts from a conclusion, and then works backward to arrive at arguments apparently favouring that conclusion. Rationalization argues for a side already selected.
	Dogpiling : A disagreement wherein one person says something wrong or offensive, and a large number of people comment in response to tell them how wrong they are, and continue to disparage the original commenter beyond any reasonable time limit.
	Grandstanding : An action that is intended to make people notice and admire you, behaving in a way that makes people pay attention to you instead of thinking about more important matters.
	Whataboutism : An attempt to discredit an opponent's position by charging them with hypocrisy without directly refuting or disproving their argument.

JARGON
  
	
TECHNOCRACY
  Sybil attack : An attacker subverts the reputation system of a P2P network by creating a large number of pseudonymous identities and uses them to gain a disproportionately large influence.
  Siren Servers : Instead of paying each individual for their contribution to the data pool, the server concentrate wealth in the hands of the few who control the data center. Alluding to the Sirens of Ulysses.
  Paradox of tolerance : States that if a society is tolerant without limit, its ability to be tolerant is eventually seized or destroyed by the intolerant.
  The Veil Of Ignorance : Behind this veil, you know nothing of yourself and your natural abilities, position in society, sex, race, nationality, or individual tastes. All individuals are simply specified as rational, free, and morally equal beings. 
  Behavioral sink : A term used to describe the collapse in behavior(stress, alienation, hostility, sexual perversion, parental incompetence, and rabid violence) which resulted from overcrowdedness in an experiment on mice, drawing parallels with societal collapse found in the human Megalopolis.
  Dunbar's Number : A suggested cognitive limit of 150, to the number of people with whom one can maintain stable social relationships.
	Sybil attack : An attacker subverts the reputation system of a P2P network by creating a large number of pseudonymous identities and uses them to gain a disproportionately large influence.
	Siren Servers : Instead of paying each individual for their contribution to the data pool, the server concentrate wealth in the hands of the few who control the data center. Alluding to the Sirens of Ulysses.
	Paradox of tolerance : States that if a society is tolerant without limit, its ability to be tolerant is eventually seized or destroyed by the intolerant.
	The Veil Of Ignorance : Behind this veil, you know nothing of yourself and your natural abilities, position in society, sex, race, nationality, or individual tastes. All individuals are simply specified as rational, free, and morally equal beings. 
	Behavioral sink : A term used to describe the collapse in behavior(stress, alienation, hostility, sexual perversion, parental incompetence, and rabid violence) which resulted from overcrowdedness in an experiment on mice, drawing parallels with societal collapse found in the human Megalopolis.
	Dunbar's Number : A suggested cognitive limit of 150, to the number of people with whom one can maintain stable social relationships.

PRINCIPLES OF LEARNING
  Beginner's Mind : Approach every problem no matter how simple or difficult with eagerness, openness, and without limiting preconceptions. Be a beginner.
	Beginner's Mind : Approach every problem no matter how simple or difficult with eagerness, openness, and without limiting preconceptions. Be a beginner.

CELESTIAL NAVIGATION
  Zenith : The imaginary point directly above a particular location, opposite to the apparent gravitational force at that location.
  Azimuth : The angle offset between the north vector and target's vector on the horizontal plane.
  Longitude : The east-west position of a point on the Earth's surface.
  Latitude : The north-south position of a point on the Earth's surface.
  Nautical Mile : Defined as 1852 meters, or one minute of angle along a meridian on the Earth.
  LAN : Local Apparent Noon.
  NSL : Noon sight latitude.
  GHA : Greenwich hour angle.
  Sun altitude offset : 4 seconds off is equal to 1 nautical mile.
	Zenith : The imaginary point directly above a particular location, opposite to the apparent gravitational force at that location.
	Azimuth : The angle offset between the north vector and target's vector on the horizontal plane.
	Longitude : The east-west position of a point on the Earth's surface.
	Latitude : The north-south position of a point on the Earth's surface.
	Nautical Mile : Defined as 1852 meters, or one minute of angle along a meridian on the Earth.
	LAN : Local Apparent Noon.
	NSL : Noon sight latitude.
	GHA : Greenwich hour angle.
	Sun altitude offset : 4 seconds off is equal to 1 nautical mile.

; Bookmarks

TECHNOLOGY LINKS
  Permacomputing : http://viznut.fi/texts-en/permacomputing.html 
  The ASCII Ribbon Campaign : http://www.asciiribbon.org/
	Permacomputing : http://viznut.fi/texts-en/permacomputing.html 
	The ASCII Ribbon Campaign : http://www.asciiribbon.org/

HARDWARE LINKS
  Pinebook : https://pine64.org/pinebook
	Pinebook : https://pine64.org/pinebook

OPERATING SYSTEM LINKS
  Linux From Scratch : http://intestinate.com/pilfs
  Plan 9 : https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs
	Linux From Scratch : http://intestinate.com/pilfs
	Plan 9 : https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs

PLAN9 LINKS
  Wiki : https://9p.io/wiki/plan9/plan_9_wiki
  Intro : http://lsub.org/who/nemo/9.intro.pdf
  IRC Channel : https://9p.io/wiki/plan9/IRC/index.html
  Bell Labs : http://doc.cat-v.org/bell_labs
  Plan9 Software : https://ftrv.se/_/9/
  How I Switched to Plan9 : http://helpful.cat-v.org/Blog/2019/12/03/0
  9Front : http://9front.org/
	Wiki : https://9p.io/wiki/plan9/plan_9_wiki
	Intro : http://lsub.org/who/nemo/9.intro.pdf
	IRC Channel : https://9p.io/wiki/plan9/IRC/index.html
	Bell Labs : http://doc.cat-v.org/bell_labs
	Plan9 Software : https://ftrv.se/_/9/
	How I Switched to Plan9 : http://helpful.cat-v.org/Blog/2019/12/03/0
	9Front : http://9front.org/

PLAN9 DEVELOPMENT LINKS

ACME LINKS

PROGRAMMING LINKS
  Duck Duck Go Lite : https://ddg.gg/lite
	Duck Duck Go Lite : https://ddg.gg/lite

PERSONAL WIKI LINKS
  https://wiki.xxiivv.com/
	https://wiki.xxiivv.com/

WIKI LINKS

PODCAST LINKS

BLOG LINKS
  Drew DeVault : https://drewdevault.com
	Drew DeVault : https://drewdevault.com

ENTRIES LINKS

GENERAL KNOWLEDGE LINKS
  Nutritional facts : http://nutritionfacts.org
	Nutritional facts : http://nutritionfacts.org

LINUX LINKS

COPYRIGHT LINKS
  The dotCommunist Manifesto : http://moglen.law.columbia.edu/publications/dcm.html
  The 18th Century Overture : http://moglen.law.columbia.edu/publications/dcm.html
	The dotCommunist Manifesto : http://moglen.law.columbia.edu/publications/dcm.html
	The 18th Century Overture : http://moglen.law.columbia.edu/publications/dcm.html

ORTHODOXY LINKS
  The Orthodox Faith : https://www.oca.org/orthodoxy/the-orthodox-faith
  Ancient Faith : https://www.ancientfaith.com
	The Orthodox Faith : https://www.oca.org/orthodoxy/the-orthodox-faith
	Ancient Faith : https://www.ancientfaith.com

MACINTOSH SOFTWARE
  Hypercard : https://en.wikipedia.org/wiki/HyperCard
  THINK Pascal : http://www.think-pascal.org
  MacPaint : https://en.wikipedia.org/wiki/MacPaint
  HexEdit : https://www.gryphel.com/c/sw/progtool/hexedit/index.html
	Hypercard : https://en.wikipedia.org/wiki/HyperCard
	THINK Pascal : http://www.think-pascal.org
	MacPaint : https://en.wikipedia.org/wiki/MacPaint
	HexEdit : https://www.gryphel.com/c/sw/progtool/hexedit/index.html

MAC SOFTWARE
  Kitty : A simple GPU based terminal emulator ~ https://sw.kovidgoyal.net/kitty/
  Aerc : A pretty good email client ~ https://aerc-mail.org
  Tmux & Mosh : For staying connected without a blimp with my remote computers and Raspberry Pis.
  Toot : for browsing Mastodon ~ https://github.com/ihabunek/toot
  Vim : for writing, programming, and viewing text files
  w3m & lynx : for browsing the web.
  weechat : for IRC (usually run remotely over tmux & mosh)
  cordless : a Discord client, for when gaming friends won't move to IRC ~ https://github.com/Bios-Marcel/cordless
  LibreWolf : for full web browsing.
	Kitty : A simple GPU based terminal emulator ~ https://sw.kovidgoyal.net/kitty/
	Aerc : A pretty good email client ~ https://aerc-mail.org
	Tmux & Mosh : For staying connected without a blimp with my remote computers and Raspberry Pis.
	Toot : for browsing Mastodon ~ https://github.com/ihabunek/toot
	Vim : for writing, programming, and viewing text files
	w3m & lynx : for browsing the web.
	weechat : for IRC (usually run remotely over tmux & mosh)
	cordless : a Discord client, for when gaming friends won't move to IRC ~ https://github.com/Bios-Marcel/cordless
	LibreWolf : for full web browsing.

BOOKS
  The Brothers Karamazov : Fyodor Dostoevsky. 1879-1880
  The Lord of the Rings : J.R.R. Tolkien. 1954-1955 
	The Brothers Karamazov : Fyodor Dostoevsky. 1879-1880
	The Lord of the Rings : J.R.R. Tolkien. 1954-1955 

MOVIES
  The Lord of the Rings : Peter Jackson. 2001-2003 
  Ostrov : Pavel Lungin. 2006
	The Lord of the Rings : Peter Jackson. 2001-2003 
	Ostrov : Pavel Lungin. 2006

ALBUMS

COMICS

VIDEOGAMES
  Pong : Ian Benway. 2020
  Crusader Kings II : Paradox Interactive. 2012
	Pong : Ian Benway. 2020
	Crusader Kings II : Paradox Interactive. 2012

READING LIST 2020
  The Traitor Baru Cormorant : Seth Dickinson
  Christianity in East and West : Christopher Dawson
  Father Seraphim Rose, His Life and Works : Hieromonk Damascene
  Religion and the Rise of Western Culture : Christopher Dawson
  Citizen\: An American Lyric : Claudia Rankine
  The Lord of the Rings : J.R.R. Tolkien
  The Iliad : Homer
	The Traitor Baru Cormorant : Seth Dickinson
	Christianity in East and West : Christopher Dawson
	Father Seraphim Rose, His Life and Works : Hieromonk Damascene
	Religion and the Rise of Western Culture : Christopher Dawson
	Citizen\: An American Lyric : Claudia Rankine
	The Lord of the Rings : J.R.R. Tolkien
	The Iliad : Homer

READING LIST CONTINUAL
  The Orthodox Study Bible
  My Life in Christ : Saint John of Kronstadt
  Lives of the Saints : OCA
	The Orthodox Study Bible
	My Life in Christ : Saint John of Kronstadt
	Lives of the Saints : OCA

STUDIO WORKSTATION
  Semi-Modular Synthesizer : Arturia Microbrute
  Analog Synthesizer : Elta Поливокс Мини
  Analog Resynthesizer : Hologram Infinite Jets
  Sound card : Traktor Audio
  Sound Computer : Monome Norns
  Midi Interface : Roland UM One
  Midi Pads : Monome Grid | Akai LPD8
  Midi Keys : Akai LPK25
	Semi-Modular Synthesizer : Arturia Microbrute
	Analog Synthesizer : Elta Поливокс Мини
	Analog Resynthesizer : Hologram Infinite Jets
	Sound card : Traktor Audio
	Sound Computer : Monome Norns
	Midi Interface : Roland UM One
	Midi Pads : Monome Grid | Akai LPD8
	Midi Keys : Akai LPK25

RARE TRACKS
  Aliceffekt - Glenda's Travels : ChipsynthMD, Toy Company 2019
  Comaduster - Winter Eyes(Aliceffekt Remix) : Tympanik Audio 2013
  Veroníque - Fisherman II(Aliceffekt Remix) : 2013
  Aliceffekt - Our Forgotten Push(feat. Mega Ran) : Mega Ran Japan Tour 2013
  iVardensphere - Ghostnote(Aliceffekt Remix) : Metropolis Records 2012
  Aliceffekt - Thievery of the Jade Books : Kinetik Festival Volume 4, Artoffact 2011
  Misteur Valaire - Dan Dan(Aliceffekt Remix) : 2011
  Doomer - Weltenzerstorer(Aliceffekt Remix) : 2010
  Iszoloscope - Dumachus Junction Feat. Aliceffekt : Beyond Within, Ant-zen 2010
  Aliceffekt - Laeis 7th Passage E.th : Kinetik Festival Volume 3, Artoffact 2010
  Stray - Does it really matter(Aliceffekt Remix) : 2009
  Perfection Plastic - Bad Girls(Aliceffekt Remix) : 2009
	Aliceffekt - Glenda's Travels : ChipsynthMD, Toy Company 2019
	Comaduster - Winter Eyes(Aliceffekt Remix) : Tympanik Audio 2013
	Veroníque - Fisherman II(Aliceffekt Remix) : 2013
	Aliceffekt - Our Forgotten Push(feat. Mega Ran) : Mega Ran Japan Tour 2013
	iVardensphere - Ghostnote(Aliceffekt Remix) : Metropolis Records 2012
	Aliceffekt - Thievery of the Jade Books : Kinetik Festival Volume 4, Artoffact 2011
	Misteur Valaire - Dan Dan(Aliceffekt Remix) : 2011
	Doomer - Weltenzerstorer(Aliceffekt Remix) : 2010
	Iszoloscope - Dumachus Junction Feat. Aliceffekt : Beyond Within, Ant-zen 2010
	Aliceffekt - Laeis 7th Passage E.th : Kinetik Festival Volume 3, Artoffact 2010
	Stray - Does it really matter(Aliceffekt Remix) : 2009
	Perfection Plastic - Bad Girls(Aliceffekt Remix) : 2009

; Collections

PROGRAMMING KNOWLEDGE
  The freedom to run the program as you wish, for any purpose.
  The freedom to study how the program works, and change it.
  The freedom to redistribute copies so you can help others.
  The freedom to distribute copies of your modified versions to others.
	The freedom to run the program as you wish, for any purpose.
	The freedom to study how the program works, and change it.
	The freedom to redistribute copies so you can help others.
	The freedom to distribute copies of your modified versions to others.

PROGRAMMING PRACTICES
  Prototype before polishing. Get it working before optimizing it.
  Separate policy from mechanism, separate interfaces from engines.
  Write simple modular parts connected by clean interfaces.
  Design programs to be connected to other programs.
  Write programs to write programs when you can.
  Design for the future, because it will be here sooner than you think.
  In interface design, always do the least surprising thing.
  When a program has nothing surprising to say, it should say nothing.
  When a program must fail, it should fail noisily and as soon as possible.
  Write big programs only when it is clear by demonstration that nothing else will do.
  Consider how you would solve your immediate problem without adding anything new.
	Prototype before polishing. Get it working before optimizing it.
	Separate policy from mechanism, separate interfaces from engines.
	Write simple modular parts connected by clean interfaces.
	Design programs to be connected to other programs.
	Write programs to write programs when you can.
	Design for the future, because it will be here sooner than you think.
	In interface design, always do the least surprising thing.
	When a program has nothing surprising to say, it should say nothing.
	When a program must fail, it should fail noisily and as soon as possible.
	Write big programs only when it is clear by demonstration that nothing else will do.
	Consider how you would solve your immediate problem without adding anything new.

DESIGN KNOWLEDGE
  Good design makes a product useful.
  Good design makes a product understandable.
  Good design is unobtrusive.
  Good design is honest.
  Good design is long-lasting.
  Good design is thorough down to the last detail.
  Good design is environmentally friendly.
  Good design is as little design as possible.
	Good design makes a product useful.
	Good design makes a product understandable.
	Good design is unobtrusive.
	Good design is honest.
	Good design is long-lasting.
	Good design is thorough down to the last detail.
	Good design is environmentally friendly.
	Good design is as little design as possible.

DESIGN PRAGNANZ
  The mind perceives objects as being symmetrical and forming around a center point.
  The mind perceives objects that are near, or proximate to each other, to be grouped together.
  The mind can only keep 7 (plus or minus 2) items in their working memory, on average.
  The mind has a propensity to best remember the first and last items in a series.
  The mind remembers uncompleted or interrupted tasks better than completed tasks.
  The mind will perceive and interpret ambiguous or complex images as the simplest form possible.
  The time it takes to make a decision increases with the number and complexity of choices.
  The time to acquire a target is a function of the distance to and size of the target.
	The mind perceives objects as being symmetrical and forming around a center point.
	The mind perceives objects that are near, or proximate to each other, to be grouped together.
	The mind can only keep 7 (plus or minus 2) items in their working memory, on average.
	The mind has a propensity to best remember the first and last items in a series.
	The mind remembers uncompleted or interrupted tasks better than completed tasks.
	The mind will perceive and interpret ambiguous or complex images as the simplest form possible.
	The time it takes to make a decision increases with the number and complexity of choices.
	The time to acquire a target is a function of the distance to and size of the target.

WORK KNOWLEDGE
  Find your passion and figure out how to get paid for it.
  Do whatever you want to do, but be the best at it.
  Strive for simplicity and competence, but embrace the messiness along the way.
  Under-promise and over-deliver, and own up to your screw-ups.
  Doing what everybody else is doing feels like the safest thing to do, making it the most competitive, and thus the riskiest.
  No one is on their deathbed is wishing they spent more time at work.
  Never stop learning.
	Find your passion and figure out how to get paid for it.
	Do whatever you want to do, but be the best at it.
	Strive for simplicity and competence, but embrace the messiness along the way.
	Under-promise and over-deliver, and own up to your screw-ups.
	Doing what everybody else is doing feels like the safest thing to do, making it the most competitive, and thus the riskiest.
	No one is on their deathbed is wishing they spent more time at work.
	Never stop learning.

WORK HABITS
  Doing the right tasks is more important than doing your tasks efficiently.
  Write down your goals. Break them down into manageable tasks.
  Tackle one task at a time, and group similar tasks together.
  You're more attentive in the morning, tackle hard stuff then.
  If you can't do it in 8 hours, you can't do it in 10.
  Don't forget to stretch, and drink plenty of water.
  Keep a record of your time use.
	Doing the right tasks is more important than doing your tasks efficiently.
	Write down your goals. Break them down into manageable tasks.
	Tackle one task at a time, and group similar tasks together.
	You're more attentive in the morning, tackle hard stuff then.
	If you can't do it in 8 hours, you can't do it in 10.
	Don't forget to stretch, and drink plenty of water.
	Keep a record of your time use.

WORK CHARISMA
  Always look a person in the eye when you talk to them.
  Always stand up to shake someone's hand.
  Be conscious of your body language.
  Ask more than you answer.
  First impressions matter.
  When you walk, look straight ahead, not at your feet.
  Never hit anyone unless they are an immediate threat.
  No matter their job or status, everyone deserves your respect.
	Always look a person in the eye when you talk to them.
	Always stand up to shake someone's hand.
	Be conscious of your body language.
	Ask more than you answer.
	First impressions matter.
	When you walk, look straight ahead, not at your feet.
	Never hit anyone unless they are an immediate threat.
	No matter their job or status, everyone deserves your respect.

WRITING KNOWLEDGE
  Never use a long word where a short one will do.
  If it is possible to cut a word out, always cut it out.
  Never use the passive where you can use the active.
  Never use a foreign or scientific word, if you can think of an English equivalent.
  Never use a figure of speech which you are used to seeing in print.
  Break any of these rules sooner than say anything outright barbarous.
	Never use a long word where a short one will do.
	If it is possible to cut a word out, always cut it out.
	Never use the passive where you can use the active.
	Never use a foreign or scientific word, if you can think of an English equivalent.
	Never use a figure of speech which you are used to seeing in print.
	Break any of these rules sooner than say anything outright barbarous.

HEALTH KNOWLEDGE
  Eat varied foods, biodiversity in the diet means less monoculture in the fields.
  Pay more for foods grown or raised less intensively and with more care, eat less.
  Eat mostly plants, especially leaves. Cook, and if you can, plant a garden.
  Avoid food products with unpronounceable ingredients, or more than five in number.
  Don't eat anything your great-great-grandmother wouldn't recognize as food.
	Eat varied foods, biodiversity in the diet means less monoculture in the fields.
	Pay more for foods grown or raised less intensively and with more care, eat less.
	Eat mostly plants, especially leaves. Cook, and if you can, plant a garden.
	Avoid food products with unpronounceable ingredients, or more than five in number.
	Don't eat anything your great-great-grandmother wouldn't recognize as food.

HEALTH BREATHING
  Expel all of the air from your lungs.
  Keep them empty for four seconds.
  Inhale through your nose for four seconds.
  Hold for four four seconds, don’t clamp down or create pressure.
	Expel all of the air from your lungs.
	Keep them empty for four seconds.
	Inhale through your nose for four seconds.
	Hold for four four seconds, don’t clamp down or create pressure.

DARK MOUNTAINEERS
  We will face this reality honestly and learn how to live with it.
  We realize that the current and upcoming crises cannot be reduced to a set of problems in need of technological or political solutions.
  We believe that the roots of the current and upcoming crises lie in the stories we have been telling ourselves.
  The end of the world as we know it is not the end of the world full stop.
  Humans are not the point and purpose of the planet.
  The Dark Mountaineers intend to challenge the stories which underpin our civilisation:
  The myth of progress: The myth first tells us that we are destined for greatness, that we began grunting in the primeval swamps, as a humble part of something called ‘nature', which we have now triumphantly subdued.
  The myth of human centrality: The myth that humans are the point and purpose of the planet.
  The myth of separation from nature: The myth that humans exist outside of natural forces, and that the agent that is nature can be vainquised.
	We will face this reality honestly and learn how to live with it.
	We realize that the current and upcoming crises cannot be reduced to a set of problems in need of technological or political solutions.
	We believe that the roots of the current and upcoming crises lie in the stories we have been telling ourselves.
	The end of the world as we know it is not the end of the world full stop.
	Humans are not the point and purpose of the planet.
	The Dark Mountaineers intend to challenge the stories which underpin our civilisation:
	The myth of progress: The myth first tells us that we are destined for greatness, that we began grunting in the primeval swamps, as a humble part of something called ‘nature', which we have now triumphantly subdued.
	The myth of human centrality: The myth that humans are the point and purpose of the planet.
	The myth of separation from nature: The myth that humans exist outside of natural forces, and that the agent that is nature can be vainquised.

SOLARPUNK KNOWLEDGE
  Solarpunks cherish both nature and progress, the individual and the community.
  They believe in a world that is green, colourful, and bright. It can be described as a literary genre, an aesthetic, or a movement. The key points are:
  A demand for technology and society to re-centre around sustainability, longevity, and balance with an emphasis on renewable energy.
  A focus on decentralisation, community activism, social justice and civic empowerment.
  A recognition that economic, social, and ecological injustices are all deeply inter-connected.
  We're destroying the world because we are, in a very literal and deliberate way, at war with it. People need more than to be made to feel stupid and guilty. They need more than a vision of doom. They need a vision of the world and of themselves that inspires them.
  Solarpunk is the opposite of cyberpunk's nihilism, offering “ingenuity, positive creation, independence, and community.”
	Solarpunks cherish both nature and progress, the individual and the community.
	They believe in a world that is green, colourful, and bright. It can be described as a literary genre, an aesthetic, or a movement. The key points are:
	A demand for technology and society to re-centre around sustainability, longevity, and balance with an emphasis on renewable energy.
	A focus on decentralisation, community activism, social justice and civic empowerment.
	A recognition that economic, social, and ecological injustices are all deeply inter-connected.
	We're destroying the world because we are, in a very literal and deliberate way, at war with it. People need more than to be made to feel stupid and guilty. They need more than a vision of doom. They need a vision of the world and of themselves that inspires them.
	Solarpunk is the opposite of cyberpunk's nihilism, offering “ingenuity, positive creation, independence, and community.”

ACTION WISDOM
  Control of actions and speech to avoid unwholesome actions.
  Effort to work as much as possible for the good of others, even at the risk of one's life.
  Decision to devote oneself to beneficial actions and to remain steadfast on it.
  Maintaining a state of mind turned to the happiness of others, to practise love for all beings without exception.
  Development of knowledge and understanding through study and analytical reflection. To teach knowledge to others. To use one's wisdom for a maximum of benefits.
  You may compete to the full extent of your capabilities, but you may not hunt down your competitors.
  The creatures who act as though they belong to the world follow the peace-keeping law, they give the creatures around them a chance to grow toward watever it's possible for them to become. That's how man came into being, the australopithecus didn't imagine that the world belonged to them, so they let him live and grow.
  You must absolutely and forever relinquish the idea that you know who live and who should die on this planet.
	Control of actions and speech to avoid unwholesome actions.
	Effort to work as much as possible for the good of others, even at the risk of one's life.
	Decision to devote oneself to beneficial actions and to remain steadfast on it.
	Maintaining a state of mind turned to the happiness of others, to practise love for all beings without exception.
	Development of knowledge and understanding through study and analytical reflection. To teach knowledge to others. To use one's wisdom for a maximum of benefits.
	You may compete to the full extent of your capabilities, but you may not hunt down your competitors.
	The creatures who act as though they belong to the world follow the peace-keeping law, they give the creatures around them a chance to grow toward watever it's possible for them to become. That's how man came into being, the australopithecus didn't imagine that the world belonged to them, so they let him live and grow.
	You must absolutely and forever relinquish the idea that you know who live and who should die on this planet.

INACTION WISDOM
  Establishment of an always perfect tolerance, irrespective of the actions and words of others towards oneself.
  Truthfulness (to say only what is right).
  Rejection of hatred and worship. Not to follow any particular idea. Maintaining the mind in equanimity.
	Establishment of an always perfect tolerance, irrespective of the actions and words of others towards oneself.
	Truthfulness (to say only what is right).
	Rejection of hatred and worship. Not to follow any particular idea. Maintaining the mind in equanimity.

EVERYDAY ITEMS
  MUJI Gel Ink Ballpoint Pen 0.5mm 
  Nook Simple Touch Reader
  COVID Mask
	MUJI Gel Ink Ballpoint Pen 0.5mm 
	Nook Simple Touch Reader
	COVID Mask

ESSENTIALS ITEMS
  Handground Coffee Grinder
  Aeropress
  Chemex
  Simple smoothie blender
	Handground Coffee Grinder
	Aeropress
	Chemex
	Simple smoothie blender

; reading notes

ILIAD CHARACTERS
  Agamemnon : King and leader of the Achaians. Atreus' son. Respected by all the Achaians, except perhaps by Achilleus. Also known as Atreides. 
  Menelaus : Brother of Agamemnon and son of Atreus. The husband of Helen, on whose behalf the Achaians go to war.
  Helen :
  Achilleus :
  Hektor : 
	Agamemnon : King and leader of the Achaians. Atreus' son. Respected by all the Achaians, except perhaps by Achilleus. Also known as Atreides. 
	Menelaus : Brother of Agamemnon and son of Atreus. The husband of Helen, on whose behalf the Achaians go to war.
	Helen :
	Achilleus :
	Hektor : 

ILIAD VOCABULARY
  Achaians : Collective name for the Greeks of the Iliad. Also known as the Argives, the Danaans, the Panhellenes, and the Hellenes.
  Trojans : 
  Atreides : Descendant of Atreus. In the Iliad, either Agamemnon or Menelaus.
	Achaians : Collective name for the Greeks of the Iliad. Also known as the Argives, the Danaans, the Panhellenes, and the Hellenes.
	Trojans : 
	Atreides : Descendant of Atreus. In the Iliad, either Agamemnon or Menelaus.

R src/database/horaire.tbtl => src/database/journal.tbtl +0 -0
M src/database/lexicon.ndtl => src/database/lexicon.ndtl +349 -357
@@ 2,456 2,448 @@
; https://wiki.xxiivv.com/site/indental.html

HOME
  HOST : home
  BREF : 
  BODY
    {^img identity/orb.png}
    <p>See {tracker recent changes}.</p>
	HOST : home
	BREF : &nbsp;
	BODY
		{^img identity/orb.png}
		<p>See {tracker recent changes}.</p>

AUDIO
  HOST : home
  TYPE : portal
  BREF : The Audio portal hosts various soundtrack, records and live projects.
  BODY
    <p>One day many years ago a man walked along and stood in the sound of the ocean on a cold sunless shore and said:</p>
    <p>"We need a voice to call across the water, to warn ships; I'll make one. I'll make a voice like all of time and all of the fog that ever was; I'll make a voice that is like an empty bed beside you all night long, and like an empty house when you open the door, and like trees in autumn with no leaves. A sound like the birds flying south, crying, and a sound like November wind and the sea on the hard, cold shore."</p>
    <p>"I'll make a sound that's so alone that no one can miss it, that whoever hears it will weep in their souls, and hearths will seem warmer, and being inside will seem better to all who hear it in the distant towns. 
    I'll make me a sound and an apparatus and they'll call it a Fog Horn and whoever bears it will know the sadness of eternity and the briefness of life."</p>
    <h5>—Ray Bradbury, The Fog Horn</h5>
	HOST : home
	TYPE : pict_portal
	BREF : The Audio portal hosts various soundtrack, records and live projects.
	BODY
		<p>One day many years ago a man walked along and stood in the sound of the ocean on a cold sunless shore and said:</p>
		<p>"We need a voice to call across the water, to warn ships; I'll make one. I'll make a voice like all of time and all of the fog that ever was; I'll make a voice that is like an empty bed beside you all night long, and like an empty house when you open the door, and like trees in autumn with no leaves. A sound like the birds flying south, crying, and a sound like November wind and the sea on the hard, cold shore."</p>
		<p>"I'll make a sound that's so alone that no one can miss it, that whoever hears it will weep in their souls, and hearths will seem warmer, and being inside will seem better to all who hear it in the distant towns.
		I'll make me a sound and an apparatus and they'll call it a Fog Horn and whoever bears it will know the sadness of eternity and the briefness of life."</p>
		<h5>—Ray Bradbury, The Fog Horn</h5>

VISUAL
  HOST : home
  TYPE : portal
  BREF : The Visual hosts design and interaction projects.
	HOST : home
	TYPE : pict_portal
	BREF : The Visual hosts design and interaction projects.

RESEARCH
  HOST : home
  TYPE : portal
  BREF : The Research hosts philosophy and linguistics projects.
	HOST : home
	TYPE : pict_portal
	BREF : The Research hosts philosophy and linguistics projects.

ABOUT
  HOST : home
  TYPE : album
  BREF : This wiki is a digital playground and personal logging system.
  BODY
    <p>The aim of this wiki is to build a form of <b>personal assistant</b> to help with the management of a vast repository of recorded statistics which includes {tracker daily logs}, notes on {index various projects} and {mirrors curated pages of general knowledge}.</p>
    <p>{Oscean}, created by {https://wiki.xxiivv.com/site/devine_lu_linvega.html Devine Lu Linvega}, is written in portable {ansi_c ANSI C} to be compiled on the {Plan9} operating system, and maintained from {hardware low-power devices}. It is built to adapt to my needs as they change, and to {longtermism technology as it evolves}. The databases are in the {tablatal tbtl}/{indental ndtl} human-readable plaintext formats.</p>
    <p>Each part of this project should aim to persist across {longtermism Technological Long Term}, not one part of it should rely on heavy dependencies. — Every function should be <b>specific</b>, <b>unobfuscated</b>, and each one carefully chosen against general-purpose libraries, frameworks or wasteful foreign entities.</p>
    <p>Using this tool should be <b>frictionless and undisruptive</b>, its formats and subsequent products versionable, re-purposable, interpretable and text-editable. Only through <b>open sources, open standards, human-readable formats</b> and their independencies, might they survive this fleeting age of self-destructing informatics.</p>
    <p>These attributes should not only be <b>perceptible in its design</b>, <br />but deeply <b>rooted in its code</b>.</p>
    <p>This type of website is a often referred to as a "memex", a kind of archive and mirror of everything that one has done, that one has learnt. It's a living document that outlines where one has been, and a tool that advises where one could go.</p>
    <q>Consider a future device, a sort of mechanized private library in which an individual stores all his books, records, and communications, and which may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.</q>
    <h5>—Vannevar Bush, As We May Think</h5>
    <h3>License</h3>
    <p>The {http://github.com/XXIIVV/Oscean original platform code} is under the <b>MIT License</b>. The {https://git.sr.ht/~exprez135/mountaen modifications} added by me are also under the <b>MIT License</b>. The {https://creativecommons.org/licenses/by-nc-sa/4.0/ assets and text content} is under the <b>BY-NC-SA 4.0 License</b>.</p>
    <p><i>You are free to</i>: <b>Share</b>: copy and redistribute the material in any medium or format. <b>Adapt</b>: remix, transform, and build upon the material.</p>
    <p><i>Under the following terms</i>: <b>Attribution</b>: You must give appropriate credit. <b>NonCommercial</b>: You may not use the material for commercial purposes. <b>ShareAlike</b>: You must distribute your contributions under the same license.</p>
    <p>You can learn more about the {mountaen related tools} by visiting the {nataniev} portal, or by reading the {faqs}. You can download a copy of the entire website content and sources as a {https://git.sr.ht/~exprez135/mountaen/archive/master.tar.gz .tar.gz}.</p>
    <p>If you have any <b>question or feedback</b>, please submit an {https://todo.sr.ht/~exprez135/mountaen issue}, for any additional informations, contact {nathaniel_ijams Nathaniel Ijams}. </p>
    <h3>Attributions</h3>
    <p>This page, {Oscean}, and my inspiration comes from the work of {https://wiki.xxiivv.com Devine Lu Lingeva}.</p>
  LINK
    source files : https://github.com/XXIIVV/oscean
    this fork : https://git.sr.ht/~exprez135/mountaen
    rss feed : https://wiki.ijams.me/links/rss.xml
	HOST : home
	TYPE : album
	BREF : This wiki is a digital playground and personal logging system.
	BODY
		<p>The aim of this wiki is to build a form of <b>personal assistant</b> to help with the management of a vast repository of recorded statistics which includes {tracker daily logs}, notes on {index various projects} and {mirrors curated pages of general knowledge}.</p>
		<p>{mountaen Oscean}, created by {https://wiki.xxiivv.com/site/devine_lu_linvega.html Devine Lu Linvega}, is written in portable ANSI C to be compiled on the {Plan9} operating system, and maintained from {hardware low-power devices}. It is built to adapt to my needs as they change, and to {longtermism technology as it evolves}. The databases are in the tbtl/ndtl human-readable plaintext formats.</p>
		<p>Each part of this project should aim to persist across {longtermism Technological Long Term}, not one part of it should rely on heavy dependencies. — Every function should be <b>specific</b>, <b>unobfuscated</b>, and each one carefully chosen against general-purpose libraries, frameworks or wasteful foreign entities.</p>
		<p>Using this tool should be <b>frictionless and undisruptive</b>, its formats and subsequent products versionable, re-purposable, interpretable and text-editable. Only through <b>open sources, open standards, human-readable formats</b> and their independencies, might they survive this fleeting age of self-destructing informatics.</p>
		<p>These attributes should not only be <b>perceptible in its design</b>, <br />but deeply <b>rooted in its code</b>.</p>
		<p>This type of website is a often referred to as a "memex", a kind of archive and mirror of everything that one has done, that one has learnt. It's a living document that outlines where one has been, and a tool that advises where one could go.</p>
		<q>Consider a future device, a sort of mechanized private library in which an individual stores all his books, records, and communications, and which may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.</q>
		<h5>—Vannevar Bush, As We May Think</h5>
		<h3>License</h3>
		<p>The {http://github.com/XXIIVV/Oscean original platform code} is under the <b>MIT License</b>. The {https://git.sr.ht/~exprez135/mountaen modifications} added by me are also under the <b>MIT License</b>. The {https://creativecommons.org/licenses/by-nc-sa/4.0/ assets and text content} is under the <b>BY-NC-SA 4.0 License</b>.</p>
		<p><i>You are free to</i>: <b>Share</b>: copy and redistribute the material in any medium or format. <b>Adapt</b>: remix, transform, and build upon the material.</p>
		<p><i>Under the following terms</i>: <b>Attribution</b>: You must give appropriate credit. <b>NonCommercial</b>: You may not use the material for commercial purposes. <b>ShareAlike</b>: You must distribute your contributions under the same license.</p>
		<p>You can learn more about the {mountaen related tools} by visiting the {nataniev} portal, or by reading the faqs. You can download a copy of the entire website content and sources as a {https://git.sr.ht/~exprez135/mountaen/archive/master.tar.gz .tar.gz}.</p>
		<p>If you have any <b>question or feedback</b>, please submit an {https://todo.sr.ht/~exprez135/mountaen issue}, for any additional informations, contact {nathaniel_ijams Nathaniel Ijams}. </p>
		<h3>Attributions</h3>
		<p>This page, {mountaen Oscean}, and my inspiration comes from the work of {https://wiki.xxiivv.com Devine Lu Lingeva}.</p>
	LINK
		source files : https://github.com/XXIIVV/oscean
		this fork : https://git.sr.ht/~exprez135/mountaen
		rss feed : https://wiki.ijams.me/links/rss.xml

NATHANIEL IJAMS
  HOST : about
  BREF : Nathaniel Ijams is an enthusiast.
  BODY
    <p><b>Nathaniel Ijams</b> is studying at {columbia Columbia University}, developing {research poorly written software}, learning to {visual illustrate}, and exploring {travel the world}.</p>
    <p>Since 2020, Nate has been populating this {about wiki} with notes on various topics, including on {language}, {lifestyle}, and {nutrition}. You can learn about his <b>related interests</b> in the {mirrors}, and in the {directory}.</p>
    <p>Get in touch via email at <b>nate@ijams.me</b>, or<br /> on the fediverse at <b>{https://fosstodon.org/@exprez135 fosstodon.org/@exprez135}</b>.</p><q>To flee is Life,<br />To linger, death.</q>
	HOST : about
	BREF : Nathaniel Ijams is an enthusiast.
	BODY
		<p><b>Nathaniel Ijams</b> is studying at Columbia University developing {research poorly written software}, learning to {visual illustrate}, and exploring {travel the world}.</p>
		<p>Since 2020, Nate has been populating this {about wiki} with notes on various topics, including on {language}, {lifestyle}, and nutrition. You can learn about his <b>related interests</b> in the {mirrors}, and in the {directory}.</p>
		<p>Get in touch via email at <b>nate@ijams.me</b>, or<br /> on the fediverse at <b>{https://fosstodon.org/@exprez135 fosstodon.org/@exprez135}</b>.</p><q>To flee is Life,<br />To linger, death.</q>

LIFESTYLE
  HOST : nathaniel ijams
  TYPE : index
  BREF : The collection of entries on Lifestyle.
  BODY
    <p>A collection of writings on how I try to live intentionally. You can find more collected questions & answers in the {faqs}.</p>
	HOST : nathaniel ijams
	TYPE : text_portal
	BREF : The collection of entries on Lifestyle.
	BODY
		<p>A collection of writings on how I try to live intentionally. You can find more collected questions & answers in the faqs.</p>

LONGTERMISM
  HOST : lifestyle
  BREF : Notes on Longtermism and sustainability.
  BODY
    <p>In an age of disposable smart devices and unrepairable electronics, there are few topics that occupy my mind as much as <b>solutioning for technological resilience</b>.</p>
    <p>We must abandon 3-in-1 packages, bloated always-online services and general planned obsolesce, and establish practices of recyclism, minimum viable products, small-sharp modular utilities.</p>
    
	HOST : lifestyle
	BREF : Notes on Longtermism and sustainability.
	BODY
		<p>In an age of disposable smart devices and unrepairable electronics, there are few topics that occupy my mind as much as <b>solutioning for technological resilience</b>.</p>
		<p>We must abandon 3-in-1 packages, bloated always-online services and general planned obsolesce, and establish practices of recyclism, minimum viable products, small-sharp modular utilities.</p>


SCHOOL
  HOST : nathaniel ijams 
  BREF : School...
  BODY
    <p>Columbia College '24</p>
	HOST : nathaniel ijams
	BREF : School...
	BODY
		<p>Columbia College '24</p>

DIRECTORY
  HOST : nathaniel ijams 
  TYPE : album
  BREF : The Directory is a curated list of timeless art.
  LIST
    books
    movies
    albums
    comics
    videogames
	HOST : nathaniel ijams
	TYPE : album
	BREF : The Directory is a curated list of timeless art.
	BODY
		{^list books}
		{^list movies}
		{^list albums}
		{^list comics}
		{^list videogames}

READINGS
  HOST : directory
  BREF : The Readings is a curated list of books. Began in late 2020.
  BODY
    <p>For a list of all time favourites, see {directory}. For notes, thoughts, and writings on my readings, see {notes}.</p>
  LIST
    reading list 2020
    reading list continual
	HOST : directory
	BREF : The Readings is a curated list of books. Began in late 2020.
	BODY
		<p>For a list of all time favourites, see {directory}. For notes, thoughts, and writings on my readings, see {notes}.</p>
		{^list reading list 2020}
		{^list reading list continual}

NOTES
  HOST : readings
  BREF : Notes, thoughts, and imaginations about various readings.
  TYPE : portal 
	HOST : readings
	BREF : Notes, thoughts, and imaginations about various readings.
	TYPE : pict_portal

BOOKMARKS
  HOST : directory
  BREF : The Bookmarks is a curated list of websites.
  BODY
    <q>Computer Science is no more about computers than astronomy is about telescopes.</q>
    <h5>—E. W. Dijkstra</h5>
  LIST
    technology links
    hardware links
    operating system links
    plan9 links
    programming links
    linux links
    copyright links
    personal wiki links
    wiki links
    podcast links
    blog links
    entries links
    general knowledge links
    orthodoxy links
	HOST : directory
	BREF : The Bookmarks is a curated list of websites.
	BODY
		<q>Computer Science is no more about computers than astronomy is about telescopes.</q>
		<h5>—E. W. Dijkstra</h5>
		{^list technology links}
		{^list hardware links}
		{^list operating system links}
		{^list plan9 links}
		{^list programming links}
		{^list linux links}
		{^list copyright links}
		{^list personal wiki links}
		{^list wiki links}
		{^list podcast links}
		{^list blog links}
		{^list entries links}
		{^list general knowledge links}
		{^list orthodoxy links}

INVENTORY
  HOST : nathaniel ijams 
  TYPE : portal
  BREF : The collection of technical details on the Inventory.
  BODY
    <p>Some of the items I carry around with me in my life and {travel travels}.</p>
	HOST : nathaniel ijams
	TYPE : pict_portal
	BREF : The collection of technical details on the Inventory.
	BODY
		<p>Some of the items I carry around with me in my life and {travel travels}.</p>

EVERYDAY
  HOST : inventory
  TYPE : album
  BREF : Everyday items found in my bag or pockets.
  LIST
    everyday items
	HOST : inventory
	TYPE : album
	BREF : Everyday items found in my bag or pockets.
	BODY
		{^list everyday items}

ESSENTIALS
  HOST : inventory
  TYPE : album
  BREF : Most practical cooking and repair tools.
  BODY
    <p>Here are some of my favourite items.</p>
  LIST
    essentials items
	HOST : inventory
	TYPE : album
	BREF : Most practical cooking and repair tools.
	BODY
		<p>Here are some of my favourite items.</p>
		{^list essentials items}

COMPUTER
  HOST : inventory
  TYPE : album
  BREF : Technical details on my current Computer setup.
  BODY
    <p>I presently use a {macbook MacBook Pro 13" 2015} as my daily driver.</p> 
    <p>I also regularly use various {raspberry Raspberry Pi} computers, as well as various remote servers running Linux distributions.</p>
	HOST : inventory
	TYPE : album
	BREF : Technical details on my current Computer setup.
	BODY
		<p>I presently use a {macbook MacBook Pro 13" 2015} as my daily driver.</p>
		<p>I also regularly use various {raspberry Raspberry Pi} computers, as well as various remote servers running Linux distributions.</p>

CAMERA
  HOST : inventory
  TYPE : album
  BREF : The Camera specs.
  BODY
    <p>For digital, I use the <b>FujiFilm X-T30</b>. This is a lovely camera for photography on the streets of New York City.</p>
    <p>My lens is the Fujifilm Fujinon XF <b>18-55mm</b> f/2.8-4.</p>
    <p>I hope to expand my inventory to include film cameras soon.</p>
	HOST : inventory
	TYPE : album
	BREF : The Camera specs.
	BODY
		<p>For digital, I use the <b>FujiFilm X-T30</b>. This is a lovely camera for photography on the streets of New York City.</p>
		<p>My lens is the Fujifilm Fujinon XF <b>18-55mm</b> f/2.8-4.</p>
		<p>I hope to expand my inventory to include film cameras soon.</p>

META
  HOST : about
  BREF : Various notes on the wiki itself.
  BODY
    <h3>Templating</h3>
    <table border='1'>
    <tr><th>plain text</th><th>result</th><th>name</th></tr>
    <tr><td><code>&#123;zoe_format&#125;</code></td><td>{zoe_format}</td><td>send</td></tr>
    <tr><td><code>&#123;https://xxiivv.com&#125;</code></td><td>{https://xxiivv.com}</td><td>link</td></tr>
    <tr><td><code>&#123;zoe_format send description&#125;</code></td><td>{zoe_format send description}</td><td>send named</td></tr>
    <tr><td><code>&#123;https://xxiivv.com link description&#125;</code></td><td>{https://xxiivv.com link description}</td><td>link named</td></tr>
    <tr><td><code>&#123;^img refs/mos6502.jpg 100&#125;</code></td><td>{^img refs/mos6502.jpg 100}</td><td>image</td></tr>
    </table>
    <h3>Units</h3>
    <ul>
    <li>Neauismetica graphics are 640x405^2</li>
    </ul>
  LINK
    You Have Already Gone to the Other World : https://youtu.be/dd-x2WZ1rzI
	HOST : about
	BREF : Various notes on the wiki itself.
	BODY
		<h3>Templating</h3>
		<table border='1'>
		<tr><th>plain text</th><th>result</th><th>name</th></tr>
		<tr><td><code>&#123;zoe_format&#125;</code></td><td>zoe_format</td><td>send</td></tr>
		<tr><td><code>&#123;https://xxiivv.com&#125;</code></td><td>{https://xxiivv.com}</td><td>link</td></tr>
		<tr><td><code>&#123;zoe_format send description&#125;</code></td><td>zoe_format send description</td><td>send named</td></tr>
		<tr><td><code>&#123;https://xxiivv.com link description&#125;</code></td><td>{https://xxiivv.com link description}</td><td>link named</td></tr>
		<tr><td><code>&#123;^img refs/mos6502.jpg 100&#125;</code></td><td>{^img refs/mos6502.jpg 100}</td><td>image</td></tr>
		</table>
		<h3>Units</h3>
		<ul>
		<li>Neauismetica graphics are 640x405^2</li>
		</ul>
	LINK
		You Have Already Gone to the Other World : https://youtu.be/dd-x2WZ1rzI

INDEX
  HOST : meta
  BREF : The Index shows all pages in the wiki.
	HOST : meta
	BREF : The Index shows all pages in the wiki.

NOW
  HOST : meta
  BREF : The now page shows infographics of current activity.
  BODY
    <p>The history of project activity is recorded with {Horaire}, to find the complete history of activity, visit the {tracker}.</p>
	HOST : meta
	BREF : The now page shows infographics of current activity.
	BODY
		<p>The history of project activity is recorded with {Horaire}, to find the complete history of activity, visit the {tracker}.</p>

IDENTITY
  HOST : meta
  TYPE : album
  BREF : Various notes on the visual choices made for the this wiki and my projects.
  BODY
    <q>I don't hate color, on the contrary, I respect color so much as to not apply it frivolously.</q>
    <p>Additional details can be found in the {faqs}.</p>
	HOST : meta
	TYPE : album
	BREF : Various notes on the visual choices made for the this wiki and my projects.
	BODY
		<q>I don't hate color, on the contrary, I respect color so much as to not apply it frivolously.</q>
		<p>Additional details can be found in the faqs.</p>

TRACKER
  HOST : meta
  BREF : The Tracker shows latest changes of the journal.
  BODY
    <p>This wiki uses the {arvelie Arvelie time format}, find today's date and learn more about the time formats {time here}. Visit the {calendar} to see the list of past and upcoming events, or check out the {now /now page} to find active projects.</p>
  LINK
    rss feed : https://wiki.ijams.me/links/rss.xml
	HOST : meta
	BREF : The Tracker shows latest changes of the journal.
	BODY
		<p>This wiki uses the {arvelie Arvelie time format}, find today's date and learn more about the time formats {time here}. Visit the {calendar} to see the list of past and upcoming events, or check out the {now /now page} to find active projects.</p>
	LINK
		rss feed : https://wiki.ijams.me/links/rss.xml

JOURNAL
  HOST : meta
  BREF : The Journal shows recent activity.
  LINK
    rss feed : https://wiki.ijams.me/links/rss.xml
	HOST : meta
	BREF : The Journal shows recent activity.
	LINK
		rss feed : https://wiki.ijams.me/links/rss.xml

CALENDAR
  HOST : meta
  BREF : The Calendar shows upcoming and past events of the journal.
  BODY
    <p>This wiki uses the {arvelie Arvelie time format}, find today's date and learn more about the time formats {time here}. To see a list of recent changes to the wiki, see the {tracker}.</p>
  LINK
    rss feed : https://wiki.ijams.me/links/rss.xml
	HOST : meta
	BREF : The Calendar shows upcoming and past events of the journal.
	BODY
		<p>This wiki uses the {arvelie Arvelie time format}, find today's date and learn more about the time formats {time here}. To see a list of recent changes to the wiki, see the {tracker}.</p>
	LINK
		rss feed : https://wiki.ijams.me/links/rss.xml

MIRRORS
  HOST : research
  TYPE : portal
  BREF : The collection of Mirrors.
  BODY
    <p>The <b>mirrors</b> are collected notes on knowledge and wisdom.</p>
    <p>Morals refer mainly to guiding principles, and ethics refer to specific rules and actions, or behaviors. A moral precept is an idea or opinion that's driven by a desire to be good. An ethical code is a set of rules that defines allowable actions or correct behavior.</p><q>Mystery exists in the mind, not in reality. <br />Confusion exists in the map, not in the territory.</q>
    <h5>—E.T. Jaynes</h5>
	HOST : research
	TYPE : pict_portal
	BREF : The collection of Mirrors.
	BODY
		<p>The <b>mirrors</b> are collected notes on knowledge and wisdom.</p>
		<p>Morals refer mainly to guiding principles, and ethics refer to specific rules and actions, or behaviors. A moral precept is an idea or opinion that's driven by a desire to be good. An ethical code is a set of rules that defines allowable actions or correct behavior.</p><q>Mystery exists in the mind, not in reality. <br />Confusion exists in the map, not in the territory.</q>
		<h5>—E.T. Jaynes</h5>

CIVILITAS
  HOST : research
  TYPE : portal
  BREF : cīvīlitās ~ politics, government, and civility
  BODY
    A collection of writings. Be aware that I've probably expressed half of this half as well as I should have liked, and I probably believe less than half of this half as well as it deserves. In other words, take everything with a grain of salt. And {nathaniel_ijams talk to me}!
	HOST : research
	TYPE : pict_portal
	BREF : cīvīlitās ~ politics, government, and civility
	BODY
		A collection of writings. Be aware that I've probably expressed half of this half as well as I should have liked, and I probably believe less than half of this half as well as it deserves. In other words, take everything with a grain of salt. And {nathaniel_ijams talk to me}!

JUDICIARY
  HOST : civilitas
  TYPE : index
  BREF : A collection of writings on the American Judiciary system.
	HOST : civilitas
	TYPE : text_portal
	BREF : A collection of writings on the American Judiciary system.

STARE DECISIS
  HOST : judiciary
  BREF : Notes on stare decisis and precedent.
  BODY
    <p>Stare decisis, latin meaning to "let the decision stand", is the use of previous case law as a rule, deciding factor, or evidence in future cases. Precedence, in a way, creates a third branch of law in addition to statutory law and regulatory law. This writing will specifically argue that hard stare decisis, using precedent as a deciding factor or as immutable fact, is both unconstitutional, unwise, and wrong. Instead, I will argue that precedence should only be used as relevant evidence for what a proper decision might be.</p>
    <ol>
      <li>Why stare decisis should not exist</li>
      <li>The practical problems of precedence</li>
        <li>The havoc of changing precedence</li>
        <li>Sovereign immunity</li>
    </ol>
	HOST : judiciary
	BREF : Notes on stare decisis and precedent.
	BODY
		<p>Stare decisis, latin meaning to "let the decision stand", is the use of previous case law as a rule, deciding factor, or evidence in future cases. Precedence, in a way, creates a third branch of law in addition to statutory law and regulatory law. This writing will specifically argue that hard stare decisis, using precedent as a deciding factor or as immutable fact, is both unconstitutional, unwise, and wrong. Instead, I will argue that precedence should only be used as relevant evidence for what a proper decision might be.</p>
		<ul>
		<li>Why stare decisis should not exist</li>
		<li>The practical problems of precedence</li>
		<li>The havoc of changing precedence</li>
		<li>Sovereign immunity</li>
		</ul>

DISCOURSE
  HOST : mirrors
  BREF : A cheatsheet on Discourse.
  BODY
    <p><b>The three gates of speech</b>: Before you speak, let your words pass through three gates.</p>
    <ul>
    <li>At the first gate, ask yourself, is it true.</li>
    <li>At the second gate ask, is it necessary.</li>
    <li>At the third gate ask, is it kind.</li>
    </ul>
    <q>You should attempt to re-express your target's position so clearly, vividly, and fairly that your target says, "Thanks, I wish I'd thought of putting it that way."</q>
    <h5>—Rapoport's First Rule</h5>
    <q>How to apologize: Quickly, specifically, sincerely.</q>
    <h5>—Kevin Kelly</h5>
    <q>Kings speak for the realm, governors for the state, popes for the church. Indeed, the titled, as titled, cannot speak <b>with</b> annyone.</q>
    <h5>—James P. Carse, Finite and Infinite Games</h5>
    <p>The arguments rankings are taken from {http://slatestarcodex.com/2018/05/08/varieties-of-argumentative-experience/ Scott Alexander}, and the responses rankings are taken from {http://www.paulgraham.com/disagree.html Paul Graham}. This page originally written and collected by {https://wiki.xxiivv.com/site/discourse.html Devine Lu Linvega}</p>
  LINK
    kind communication : https://www.gnu.org/philosophy/kind-communication.html
  LIST
    arguments
    responses
    beliefs
	HOST : mirrors
	BREF : A cheatsheet on Discourse.
	BODY
		<p><b>The three gates of speech</b>: Before you speak, let your words pass through three gates.</p>
		<ul>
		<li>At the first gate, ask yourself, is it true.</li>
		<li>At the second gate ask, is it necessary.</li>
		<li>At the third gate ask, is it kind.</li>
		</ul>
		<q>You should attempt to re-express your target's position so clearly, vividly, and fairly that your target says, "Thanks, I wish I'd thought of putting it that way."</q>
		<h5>—Rapoport's First Rule</h5>
		<q>How to apologize: Quickly, specifically, sincerely.</q>
		<h5>—Kevin Kelly</h5>
		<q>Kings speak for the realm, governors for the state, popes for the church. Indeed, the titled, as titled, cannot speak <b>with</b> annyone.</q>
		<h5>—James P. Carse, Finite and Infinite Games</h5>
		<p>The arguments rankings are taken from {http://slatestarcodex.com/2018/05/08/varieties-of-argumentative-experience/ Scott Alexander}, and the responses rankings are taken from {http://www.paulgraham.com/disagree.html Paul Graham}. This page originally written and collected by {https://wiki.xxiivv.com/site/discourse.html Devine Lu Linvega}</p>
	LINK
		kind communication : https://www.gnu.org/philosophy/kind-communication.html
	BODY
		{^list arguments}
		{^list responses}
		{^list beliefs}

NATANIEV
  HOST : research
  TYPE : portal
  BREF : The Nataniev ecosystem is a collection of exocortex tools.
  BODY
    <p><b>Nataniev</b> is a collection of free and open-source software following a singular design {about philosophy}, and {aesthetics aesthetic}. Nataniev is created by Devine Lu Linvega.</p>
	HOST : research
	TYPE : pict_portal
	BREF : The Nataniev ecosystem is a collection of exocortex tools.
	BODY
		<p><b>Nataniev</b> is a collection of free and open-source software following a singular design {about philosophy}, and aesthetic. Nataniev is created by Devine Lu Linvega.</p>

HORAIRE
  HOST : nataniev
  BREF : Horaire is a time-tracking tool.
  BODY
    <p><b>Horaire</b> is a time-tracking engine designed to record and host daily activity logs. A log is recorded at the {routine end of the day}, and contains 3 values.</p>
	HOST : nataniev
	BREF : Horaire is a time-tracking tool.
	BODY
		<p><b>Horaire</b> is a time-tracking engine designed to record and host daily activity logs. A log is recorded at the end of the day, and contains 3 values.</p>

MOUNTAEN
  HOST : nataniev
  TYPE : index
  BREF : Mountaen is an Oscean is a flat-file wiki engine.
  BODY
    <p><b>Oscean</b> is a static wiki engine written entirely in {ansi_c ANSI C}, designed to be deployed from {raspberry low-power devices} with {https://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc} as its only dependecy. The engine has grown into a collection of tools, including the time tracking software {horaire}, as well as the time formats {neralie} & {arvelie}.</p>
    <p>The wiki and related tools are designed to be used {about offline first}, so the content is generally accessed and edited locally, there are no offsite queries for critical resources.</p>
    <p>The generated files use no javascript, are optimized for screen-readers and terminal browsers, the entire CSS content of the entire site should be under 1kb. The software architecture is inspired by {longtermism}.</p>
  LINK
    sources : https://github.com/XXIIVV/Oscean
    live : https://wiki.xxiivv.com
	HOST : nataniev
	TYPE : text_portal
	BREF : Mountaen is an Oscean is a flat-file wiki engine.
	BODY
		<p><b>Oscean</b> is a static wiki engine written entirely in ANSI C, designed to be deployed from {raspberry low-power devices} with {https://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc} as its only dependecy. The engine has grown into a collection of tools, including the time tracking software {horaire}, as well as the time formats neralie & {arvelie}.</p>
		<p>The wiki and related tools are designed to be used {about offline first}, so the content is generally accessed and edited locally, there are no offsite queries for critical resources.</p>
		<p>The generated files use no javascript, are optimized for screen-readers and terminal browsers, the entire CSS content of the entire site should be under 1kb. The software architecture is inspired by {longtermism}.</p>
	LINK
		sources : https://github.com/XXIIVV/Oscean
		live : https://wiki.xxiivv.com

TIME
  HOST : nataniev
  TYPE : index
  BREF : Documentation on the different Time formats.
  BODY
    <iframe width='100%' height='380' src='https://clock.xxiivv.com' style='border:0' allowfullscreen></iframe>
	HOST : nataniev
	TYPE : text_portal
	BREF : Documentation on the different Time formats.
	BODY
		<iframe width='100%' height='380' src='https://clock.xxiivv.com' style='border:0' allowfullscreen></iframe>

ARVELIE
  HOST : time
  BREF : Arvelie is an alphabetic date format.
  BODY
    <p>The <b>Arvelie calendar</b> has <b>26 months</b> of <b>14 days</b> each.</p>
    <p>Each month has <b>2 weeks</b> of <b>7 days</b>, and each month's name is one of the 26 letters of the alphabet. The 365th day of the year is the <i>Year Day</i>(+01), preceded by the <i>Leap Day</i>(+02) on leap years.</p>
    <ul><li><b>02A01</b> 2002-01-01</li><li><b>01D07</b> 2001-02-18</li><li><b>13B12</b> 2013-01-26</li><li><b>02E07</b> 2002-03-04</li><li><b>24C01</b> 2024-01-29</li><li><b>03+01</b> 2003-12-31</li></ul>
    <p>To calculate the day of the year, convert the month's letter to a value, starting with 0 for A, multiply by 14 and add the day of the month. For example, J05 is equal to <code>(+ 5 (* 9 14))</code>, or 131.</p>
  LINK
    ANSI C Library : https://github.com/XXIIVV/oscean/tree/master/src/projects/arvelie
    13 Month Calendar : https://en.wikipedia.org/wiki/International_Fixed_Calendar
	HOST : time
	BREF : Arvelie is an alphabetic date format.
	BODY
		<p>The <b>Arvelie calendar</b> has <b>26 months</b> of <b>14 days</b> each.</p>
		<p>Each month has <b>2 weeks</b> of <b>7 days</b>, and each month's name is one of the 26 letters of the alphabet. The 365th day of the year is the <i>Year Day</i>(+01), preceded by the <i>Leap Day</i>(+02) on leap years.</p>
		<ul><li><b>02A01</b> 2002-01-01</li><li><b>01D07</b> 2001-02-18</li><li><b>13B12</b> 2013-01-26</li><li><b>02E07</b> 2002-03-04</li><li><b>24C01</b> 2024-01-29</li><li><b>03+01</b> 2003-12-31</li></ul>
		<p>To calculate the day of the year, convert the month's letter to a value, starting with 0 for A, multiply by 14 and add the day of the month. For example, J05 is equal to <code>(+ 5 (* 9 14))</code>, or 131.</p>
	LINK
		ANSI C Library : https://github.com/XXIIVV/oscean/tree/master/src/projects/arvelie
		13 Month Calendar : https://en.wikipedia.org/wiki/International_Fixed_Calendar

LANGUAGE
  HOST : research
  TYPE : portal
  BREF : Various Language notes on natural, synthetic, and programming languages.
  BODY
    <p>Welcome to the <b>Language Portal</b>, the goal of these pages is to host a few resources, summaries and notes from my own language studies.</p> 
  LIST
    principles of learning
    dictionary
	HOST : research
	TYPE : pict_portal
	BREF : Various Language notes on natural, synthetic, and programming languages.
	BODY
		<p>Welcome to the <b>Language Portal</b>, the goal of these pages is to host a few resources, summaries and notes from my own language studies.</p>
		{^list principles of learning}
		{^list dictionary}

UNIX
  HOST : language
  TYPE : portal
  BREF : Unix is a family of computer operating systems that derive from the original Unix from Bell Labs.
  BODY
    <p>This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.</p>
    <p>Expect the output of every program to become the input to another, as yet unknown, program. Don’t clutter output with extraneous information. Avoid stringently columnar or binary input formats. Don’t insist on interactive input.</p>
  LIST
    jargon
	HOST : language
	TYPE : pict_portal
	BREF : Unix is a family of computer operating systems that derive from the original Unix from Bell Labs.
	BODY
		<p>This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.</p>
		<p>Expect the output of every program to become the input to another, as yet unknown, program. Don’t clutter output with extraneous information. Avoid stringently columnar or binary input formats. Don’t insist on interactive input.</p>
		{^list jargon}

PLAN9
  HOST : unix
  TYPE : portal
  BREF : Plan 9 is a fully-featured, clean, compact and uniform operating system built as a successor to Unix.
  BODY
    <p>This page serves to introduce to Plan 9, I currently use Plan 9 as an experimental computer installed on a {Raspberry Raspberry Pi B+}. I use the {http://9front.org 9front} Raspberry Pi images.</p>
    <q>An argument for simplicity and clarity.</q>
    <h5>—Rob Pike</h5>
  LIST
    plan9 links
  LINK
    Molly Nilsson 1995 : https://mollynilsson.bandcamp.com/track/1995
	HOST : unix
	TYPE : pict_portal
	BREF : Plan 9 is a fully-featured, clean, compact and uniform operating system built as a successor to Unix.
	BODY
		<p>This page serves to introduce to Plan 9, I currently use Plan 9 as an experimental computer installed on a {Raspberry Raspberry Pi B+}. I use the {http://9front.org 9front} Raspberry Pi images.</p>
		<q>An argument for simplicity and clarity.</q>
		<h5>—Rob Pike</h5>
		{^list plan9 links}
	LINK
		Molly Nilsson 1995 : https://mollynilsson.bandcamp.com/track/1995

HARDWARE
  HOST : research
  TYPE : portal
  BREF : A handful of projects on smaller hardware, and experiments with larger hardware.
  BODY <p>If a system has a million elements and each element only one time out of a million, a breakdown is certain.</p>
	HOST : research
	TYPE : pict_portal
	BREF : A handful of projects on smaller hardware, and experiments with larger hardware.
	BODY <p>If a system has a million elements and each element only one time out of a million, a breakdown is certain.</p>

MACBOOK
  HOST : hardware
  TYPE : portal
  BREF : A handful of projects to better use my MacBook Pro 13" 2015.
  BODY
    <p>It can be harmful, while pursuing {longtermism}, to constantly rid yourself of bloated hardware for better hardware. Use what ya got.</p>
    <p>I run macOS Catalina on this device, and occasionally start up a VM to run linux. While I would like the flexibility to use this device without starting up any GUI, I manage to live almost entirely in a terminal emulator.</p>
  LIST
    mac software
	HOST : hardware
	TYPE : pict_portal
	BREF : A handful of projects to better use my MacBook Pro 13" 2015.
	BODY
		<p>It can be harmful, while pursuing {longtermism}, to constantly rid yourself of bloated hardware for better hardware. Use what ya got.</p>
		<p>I run macOS Catalina on this device, and occasionally start up a VM to run linux. While I would like the flexibility to use this device without starting up any GUI, I manage to live almost entirely in a terminal emulator.</p>
		{^list mac software}

RASPBERRY
  HOST : hardware
  TYPE : portal
  BREF : The Raspberry is a small inexpensive single-board computer.
  BODY
    <p>I use multiple Raspberry Pis for various work. I use a Raspberry Pi 4 with 4GB of RAM as a home server, running {https://pi-hole.net Pi-hole} for my network. I also have multiple Raspberry Pi Zero Ws used for multiple rotating tasks. An older Raspberry Pi B+ is my experimental computer running {plan9}.</p>
	HOST : hardware
	TYPE : pict_portal
	BREF : The Raspberry is a small inexpensive single-board computer.
	BODY
		<p>I use multiple Raspberry Pis for various work. I use a Raspberry Pi 4 with 4GB of RAM as a home server, running {https://pi-hole.net Pi-hole} for my network. I also have multiple Raspberry Pi Zero Ws used for multiple rotating tasks. An older Raspberry Pi B+ is my experimental computer running {plan9}.</p>

NOTEBOOK
  HOST : research
  TYPE : portal
  BREF : Scribblings which haven't made their way into the main Wiki yet.
	HOST : research
	TYPE : pict_portal
	BREF : Scribblings which haven't made their way into the main Wiki yet.

KNOWLEDGE
  HOST : notebook
  BREF : Knowledge, lineage, civilization, institutions, and the future.
  BODY
    <p>This outlines my ever-shifting ideas on knowledge, civilization, institutions, and the future.</p> 
	HOST : notebook
	BREF : Knowledge, lineage, civilization, institutions, and the future.
	BODY
		<p>This outlines my ever-shifting ideas on knowledge, civilization, institutions, and the future.</p>

PHOTOGRAPHY
  HOST : visual
  TYPE : portal
  BREF : The Photography Portal collects various albums over multiple mediums.
  BODY
    <p>View the list of {camera} equipment.</p>
	HOST : visual
	TYPE : pict_portal
	BREF : The Photography Portal collects various albums over multiple mediums.
	BODY
		<p>View the list of {camera} equipment.</p>

PERSONAL
  HOST : photography
  TYPE : album
  BREF : The Personal album contain various memories.
	HOST : photography
	TYPE : album
	BREF : The Personal album contain various memories.

TRAVEL
  HOST : photography
  TYPE : portal
  BREF : Travel diaries around the world.
  BODY
    <q>If you think too much about where you are going, you lose respect for where you are. <br /><br />The most effective way to lower the quality of travel is to go somewhere. Going to the lake, is a functional process, with the road an obstacle lying in the way.</q>
    <h5>—Steven K. Roberts, Computing Across America, Chapter 22</h5>
	HOST : photography
	TYPE : pict_portal
	BREF : Travel diaries around the world.
	BODY
		<q>If you think too much about where you are going, you lose respect for where you are. <br /><br />The most effective way to lower the quality of travel is to go somewhere. Going to the lake, is a functional process, with the road an obstacle lying in the way.</q>
		<h5>—Steven K. Roberts, Computing Across America, Chapter 22</h5>

BROOKLYN
  HOST : travel
  TYPE : album
  BREF : A month in Brooklyn during the COVID-19 pandemic. 
  BODY
    <p>Back in 2020, I traveled alone and spent a month living in Flatbush, Brooklyn near Prospect Park. In this unfamiliar and spectacular place, I began my college career online.</p>
	HOST : travel
	TYPE : album
	BREF : A month in Brooklyn during the COVID-19 pandemic.
	BODY
		<p>Back in 2020, I traveled alone and spent a month living in Flatbush, Brooklyn near Prospect Park. In this unfamiliar and spectacular place, I began my college career online.</p>

; notes

ILIAD
  HOST : notes
  TYPE : portal
  BREF : The Iliad of Homer
  BODY
    <p>Read as part of the Core Curriculum at Columbia University. Page and verse references come from the Richmond Lattimore 2011 edition.</p>
    <p>You can see some of my writing about the book with the navigation system above.</p>
    <p>What struck me most was the ending of this epic. After all the battle, bloodshed, anger, disgust, treachery, and hopelessness of the fighting, we end with the Achaians and the Trojans both going through much effort and pain to honor and mourn those they have lost. Even knowing the future pain of the war, the Achaians burn and celebrate Patroklos while the Trojans strain to recover Hektor. What a reminder of how much *love* still conquers. We might see these figures as near savage in warfare. But life and love, I think, is what they truly value. The Iliad might just be a pacifist work.</p>
    <p>Additional reading:</p>
    <ol>
    <li>Simone Weil: The Iliad or the Poem of Force</li>
    </ol>
  LIST
    iliad characters
    iliad vocabulary

ILIAD-JOURNAL-ONE
  HOST : iliad
  BREF : Books 7-12 of The Iliad

ILIAD-JOURNAL-TWO
  HOST : iliad
  BREF : Books 13-18 of The Iliad

ILIAD-JOURNAL-THREE
  HOST : iliad
  BREF : Books 19-24 of The Iliad
	HOST : notes
	TYPE : pict_portal
	BREF : The Iliad of Homer
	BODY
		<p>Read as part of the Core Curriculum at Columbia University. Page and verse references come from the Richmond Lattimore 2011 edition.</p>
		<p>You can see some of my writing about the book with the navigation system above.</p>
		<p>What struck me most was the ending of this epic. After all the battle, bloodshed, anger, disgust, treachery, and hopelessness of the fighting, we end with the Achaians and the Trojans both going through much effort and pain to honor and mourn those they have lost. Even knowing the future pain of the war, the Achaians burn and celebrate Patroklos while the Trojans strain to recover Hektor. What a reminder of how much *love* still conquers. We might see these figures as near savage in warfare. But life and love, I think, is what they truly value. The Iliad might just be a pacifist work.</p>
		<p>Additional reading:</p>
		<ol>
		<li>Simone Weil: The Iliad or the Poem of Force</li>
		</ol>
		{^list iliad characters}
		{^list iliad vocabulary}

ILIAD JOURNAL ONE
	HOST : iliad
	BREF : Books 7-12 of The Iliad

ILIAD JOURNAL TWO
	HOST : iliad
	BREF : Books 13-18 of The Iliad

ILIAD JOURNAL THREE
	HOST : iliad
	BREF : Books 19-24 of The Iliad

D src/helpers.c => src/helpers.c +0 -262
@@ 1,262 0,0 @@
typedef enum { false,
	       true } bool;

bool
isalphachr(char ch)
{
	return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}

bool
isnumchr(char ch)
{
	return ch >= '0' && ch <= '9';
}

bool
isspacechr(char ch)
{
	return ch == ' ';
}

bool
isalphanumchr(char ch)
{
	return !isalphachr(ch) && !isnumchr(ch) && !isspacechr(ch) ? false : true;
}

bool
isalphanumstr(char* src)
{
	int i;
	for(i = 0; i < (int)strlen(src); i++) {
		if(!isalphanumchr(src[i])) {
			printf("%c\n", src[i]);
			return false;
		}
	}
	return true;
}

int
indexstr(char* a, char* b)
{
	int i, j, alen = strlen(a), blen = strlen(b);
	for(i = 0; i < alen; i++) {
		for(j = 0; j < blen; j++) {
			if(a[i + j] == '\0') {
				return -1;
			}
			if(a[i + j] != b[j]) {
				break;
			}
			if(j == blen - 1) {
				return i;
			}
		}
	}
	return -1;
}

int
indexchr(char* str, char target)
{
	int i;
	int len = strlen(str);
	for(i = 0; i < len; i++) {
		if(str[i] == target) {
			return i;
		}
	}
	return -1;
}

bool
isurlstr(char* str)
{
	return indexstr(str, "://") >= 0;
}

void
substr(char* src, char* dest, int from, int to)
{
	memcpy(dest, src + from, to);
	dest[to] = '\0';
}

void
swapstr(char* src, char* dest, char* a, char* b)
{
	char head[1024], tail[1024];
	int index = indexstr(src, a);
	if(index < 0) {
		return;
	}
	substr(src, head, 0, index);
	substr(src, tail, index + strlen(a), strlen(src) - index - strlen(a));
	dest[0] = '\0';
	strcat(dest, head);
	strcat(dest, b);
	strcat(dest, tail);
}

void
cpystr(char* src, char* dest)
{
	int i;
	int len = strlen(src);
	for(i = 0; i < len; i++) {
		dest[i] = src[i];
	}
	dest[len] = '\0';
}

void
ucstr(char* dest)
{
	int i, len = strlen(dest);
	for(i = 0; i < len; i++) {
		dest[i] = toupper(dest[i]);
	}
}

void
lcstr(char* dest)
{
	int i, len = strlen(dest);
	for(i = 0; i < len; i++) {
		dest[i] = tolower(dest[i]);
	}
}

char*
trimstr(char* str)
{
	char* end;
	while(isspace((unsigned char)*str))
		str++;
	if(*str == 0)
		return str;
	end = str + strlen(str) - 1;
	while(end > str && isspace((unsigned char)*end))
		end--;
	end[1] = '\0';
	return str;
}

void
alphanumstr(char* src, char* dest)
{
	int i;
	int len = strlen(src) + 1;
	for(i = 0; i < len; i++) {
		dest[i] = src[i];
		if(dest[i] == '\0') {
			break;
		}
		if(!isalphanumchr(dest[i])) {
			dest[i] = ' ';
		} else {
			dest[i] = tolower(dest[i]);
		}
	}
	dest[len - 1] = '\0';
}

void
filenamestr(char* str, char* mod)
{
	int i;
	int len = strlen(str) + 1;
	for(i = 0; i < len; i++) {
		mod[i] = str[i];
		if(mod[i] == '\0') {
			break;
		}
		if(!isalphachr(mod[i]) && !isnumchr(mod[i])) {
			mod[i] = '_';
		} else {
			mod[i] = tolower(mod[i]);
		}
	}
	mod[len - 1] = '\0';
}

void
firstword(char* src, char* dest)
{
	int until = indexchr(src, ' ');
	if(until > -1) {
		substr(src, dest, 0, until);
	} else {
		substr(src, dest, 0, strlen(src));
	}
}

int
count_leading_spaces(char* str)
{
	int i;
	int len = strlen(str) + 1;
	for(i = 0; i < len; i++) {
		if(str[i] != ' ') {
			return i;
		}
	}
	return -1;
}

int
index_of_string(char* a[], int num_elements, char* value)
{
	int i;
	for(i = 0; i < num_elements; i++) {
		if(strcmp(a[i], value) == 0) {
			return i;
		}
	}
	return -1;
}

float
clock_since(clock_t start)
{
	double cpu_time_used = ((double)(clock() - start)) / CLOCKS_PER_SEC;
	return cpu_time_used * 1000;
}

char*
nowstr(void)
{
	time_t now;
	time(&now);
	return ctime(&now);
}

void
fputs_lifeline(FILE* f, int limit_from, int limit_to, int range_from,
               int range_to, int len)
{
	int i;
	float f_len = len - 1;
	bool init = false;
	for(i = 0; i < len; i++) {
		float epoch = (i / f_len) * (limit_to - limit_from) + limit_from;
		if(epoch > range_from && !init) {
			fputs("+", f);
			init = true;
		} else if(epoch >= range_from && epoch <= range_to) {
			fputs("+", f);
		} else {
			fputs("-", f);
		}
	}
}

void
fputs_rfc2822(FILE* f, time_t t)
{
	char rfc_2822[40];
	strftime(rfc_2822, sizeof(rfc_2822), "%a, %d %b %Y 00:00:00 +0900", localtime(&t));
	fprintf(f, "%s", rfc_2822);
}
\ No newline at end of file

A src/helpers.h => src/helpers.h +241 -0
@@ 0,0 1,241 @@
int
cisp(char c)
{
	return c == ' ' || c == '\t' || c == '\n' || c == '\r';
}

int
cial(char c)
{
	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

int
cinu(char c)
{
	return c >= '0' && c <= '9';
}

int
clca(int c)
{
	return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c;
}

int
cuca(char c)
{
	return c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c;
}

int
cans(char c)
{
	return cial(c) || cinu(c) || cisp(c);
}

int
cpad(char* s, char c)
{
	int i = 0;
	while(s[i] == c && s[i] && s[++i])
		;
	return i;
}

int
cpos(char* s, char c)
{
	int i = 0;
	while(s[i] && s[i])
		if(s[i++] == c)
			return i - 1;
	return -1;
}

int
slen(char* s)
{
	int i = 0;
	while(s[i] && s[++i])
		;
	return i;
}

char*
suca(char* s)
{
	int i;
	for(i = 0; i < slen(s); i++)
		s[i] = cuca(s[i]);
	return s;
}

char*
slca(char* s)
{
	int i;
	for(i = 0; i < slen(s); i++)
		s[i] = clca(s[i]);
	return s;
}

char*
scsw(char* s, char a, char b)
{
	int i;
	for(i = 0; i < slen(s); i++)
		s[i] = s[i] == a ? b : s[i];
	return s;
}

int
scmp(char* a, char* b)
{
	int i = 0;
	while(a[i] == b[i])
		if(!a[i++])
			return 1;
	return 0;
}

int
sans(char* s)
{
	int i;
	for(i = 0; i < slen(s); i++)
		if(!cans(s[i]))
			return 0;
	return 1;
}

char*
strm(char* s)
{
	char* end;
	while(cisp(*s))
		s++;
	if(*s == 0)
		return s;
	end = s + slen(s) - 1;
	while(end > s && cisp(*end))
		end--;
	end[1] = '\0';
	return s;
}

int
spos(char* s, char* ss)
{
	int a = 0, b = 0;
	while(s[a]) {
		if(s[a] == ss[b]) {
			if(!ss[b + 1])
				return a - b;
			b++;
		} else
			b = 0;
		a++;
	}
	return -1;
}

int
sint(char* s, int len)
{
	int num = 0, i = 0;
	while(s[i] && cinu(s[i]) && i < len) {
		num = num * 10 + (s[i] - '0');
		i++;
	}
	return num;
}

int
surl(char* s)
{
	return spos(s, "://") >= 0 || spos(s, "../") >= 0;
}

char*
scpy(char* src, char* dst)
{
	int i = 0;
	while((dst[i] = src[i]))
		i++;
	return dst;
}

char*
sstr(char* src, char* dst, int from, int to)
{
	int i;
	char *a = (char*)src + from, *b = (char*)dst;
	for(i = 0; i < to; i++)
		b[i] = a[i];
	dst[to] = '\0';
	return dst;
}

int
afnd(char* src[], int len, char* val)
{
	int i;
	for(i = 0; i < len; i++)
		if(scmp(src[i], val))
			return i;
	return -1;
}

char*
ccat(char* dst, char c)
{
	int len = slen(dst);
	dst[len] = c;
	dst[len + 1] = '\0';
	return dst;
}

char*
scat(char* dst, const char* src)
{
	char* ptr = dst + slen(dst);
	while(*src)
		*ptr++ = *src++;
	*ptr = '\0';
	return dst;
}

/* old */

float
clockoffset(clock_t start)
{
	return (((double)(clock() - start)) / CLOCKS_PER_SEC) * 1000;
}

void
fpRFC2822(FILE* f, time_t t)
{
	struct tm* tm = localtime(&t);
	char* days[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
	char* months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
	fprintf(f, "%s, %02d %s %d 00:00:00 +0900", days[tm->tm_wday], tm->tm_mday, months[tm->tm_mon], tm->tm_year + 1900);
}

void
fpRFC3339(FILE* f, time_t t)
{
	struct tm* tm = localtime(&t);
	fprintf(f, "%04d-%02d-%02dT%02d:%02d:%02d%c%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, '-', 7, 0); /* Vancouver GMT-7*/
}

int
marble(int year, int month, int day)
{
	struct tm birth;
	birth.tm_year = year - 1900;
	birth.tm_mon = month - 1;
	birth.tm_mday = day;
	return (time(NULL) - mktime(&birth)) / 604800;
}

M src/main.c => src/main.c +723 -857
@@ 1,746 1,784 @@
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "projects/arvelie/arvelie.c"
#include "helpers.h"
#include "projects/arvelie/arvelie.h"

#include "helpers.c"
#define STRMEM 4096 * 96
#define GLOMEM 500
#define LEXMEM 500
#define HORMEM 3500
#define ITEMS 64

#define KEY_BUF_LEN 32
#define STR_BUF_LEN 255
#define TERM_DICT_BUFFER 16
#define TERM_LIST_BUFFER 16
#define TERM_BODY_BUFFER 24
#define LEXICON_BUFFER 512
#define LOGS_RANGE 56

#define NAME "Tellurium"
#define DOMAIN "https://wiki.ijams.me/"
#define LOCATION "Tulsa, Oklahoma"
#define REPOPATH "https://git.sr.ht/~exprez135/mountaen/"

typedef struct Block {
	int len;
	char data[STRMEM];
} Block;

typedef struct List {
	char name[KEY_BUF_LEN];
	char keys[100][100];
	char vals[100][500];
	int pairs_len;
	char items[100][500];
	int items_len;
	int links_len;
	int len;
	int routes;
	char* name;
	char* keys[ITEMS];
	char* vals[ITEMS];
} List;

typedef struct Term {
	char name[KEY_BUF_LEN];
	char host[21];
	char bref[200];
	char type[KEY_BUF_LEN];
	char date_from[6];
	char date_last[6];
	char body[30][750];
	int body_len;
	struct Term* parent;
	struct Term* children[20];
	int children_len;
	char link_keys[20][KEY_BUF_LEN];
	char link_vals[20][100];
	int link_len;
	char list[20][31];
	int list_len;
	List* docs[20];
	int docs_len;
	struct Term* incoming[30];
	int incoming_len;
	int outgoing_len;
	int logs_len;
	int events_len;
	int ch;
	int fh;
	char* name;
	char* host;
	char* bref;
	char* type;
	char* filename;
	char* date_from;
	char* date_last;
	char* body[ITEMS];
	struct List link;
	struct Term* parent;
	struct Term* children[ITEMS];
	struct Term* incoming[ITEMS];
} Term;

typedef struct Log {
	char date[6];
	char rune[1];
	int code;
	char host[KEY_BUF_LEN];
	int pict;
	char name[KEY_BUF_LEN];
	bool is_event;
	char rune;
	char* date;
	char* name;
	Term* term;
} Log;

typedef struct Glossary {
	int len;
	List lists[100];
	List lists[GLOMEM];
} Glossary;

typedef struct Lexicon {
	int len;
	Term terms[350];
	Term terms[LEXMEM];
} Lexicon;

typedef struct Journal {
	int len;
	Log logs[3500];
	Log logs[HORMEM];
} Journal;

Glossary all_lists;
Lexicon all_terms;
Journal all_logs;
int
error(char* msg, char* val)
{
	printf("Error: %s(%s)\n", msg, val);
	return 0;
}

/* Block */

char*
push(Block* b, char* s)
{
	int i = 0, o = b->len;
	while(s[i])
		b->data[b->len++] = s[i++];
	b->data[b->len++] = '\0';
	return &b->data[o];
}

/* List */

List*
_list(List* l, char* name)
{
	l->len = 0;
	l->routes = 0;
	l->name = slca(name);
	return l;
}

List*
find_list(Glossary* glossary, char* name)
findlist(Glossary* glo, char* name)
{
	int i;
	for(i = 0; i < glossary->len; ++i) {
		List* l = &glossary->lists[i];
		if(!strcmp(name, l->name)) {
			return l;
		}
	}
	for(i = 0; i < glo->len; ++i)
		if(scmp(name, glo->lists[i].name))
			return &glo->lists[i];
	return NULL;
}

/* Term */

Term*
find_term(Lexicon* lexicon, char* name)
_term(Term* t, char* name)
{
	t->body_len = 0;
	t->children_len = 0;
	t->incoming_len = 0;
	t->outgoing_len = 0;
	t->logs_len = 0;
	t->events_len = 0;
	t->ch = 0;
	t->fh = 0;
	t->name = slca(name);
	return t;
}

Term*
findterm(Lexicon* lex, char* name)
{
	int i;
	char buffer[STR_BUF_LEN];
	alphanumstr(name, buffer);
	for(i = 0; i < lexicon->len; ++i) {
		Term* t = &lexicon->terms[i];
		if(!strcmp(buffer, t->name)) {
			return t;
		}
	}
	scsw(slca(name), '_', ' ');
	for(i = 0; i < lex->len; ++i)
		if(scmp(name, lex->terms[i].name))
			return &lex->terms[i];
	return NULL;
}

/* Log */

Log*
_log(Log* l, char* date)
{
	l->code = 0;
	l->pict = 0;
	l->date = date;
	return l;
}

Log*
find_last_diary(Term* term)
finddiary(Journal* jou, Term* t)
{
	int i;
	for(i = 0; i < all_logs.len; ++i) {
		Log* l = &all_logs.logs[i];
		if(l->term != term || l->pict < 1) {
			continue;
		}
		return l;
	}
	for(i = 0; i < jou->len; ++i)
		if(jou->logs[i].term == t && jou->logs[i].pict > 0)
			return &jou->logs[i];
	return NULL;
}

void
register_incoming(Term* src, char* dest)
/* File */

FILE*
getfile(char* dir, char* filename, char* ext, char* op)
{
	Term* host = find_term(&all_terms, dest);
	if(host) {
		host->incoming[host->incoming_len] = src;
		host->incoming_len++;
	} else {
		printf("Warning: Unknown incoming(%s)\n", dest);
	}
	char filepath[1024];
	filepath[0] = '\0';
	scat(filepath, dir);
	scat(filepath, filename);
	scat(filepath, ext);
	scat(filepath, "\0");
	return fopen(filepath, op);
}

/* File Print */

void
build_lifeline(FILE* f, Term* term)
fplifeline(FILE* f, Term* t)
{
	int limit_from = arvelie_to_epoch("06I04");
	int limit_to = get_epoch();
	int range_from = arvelie_to_epoch(term->date_from);
	int range_to = arvelie_to_epoch(term->date_last);
	int i;
	bool init = false;
	int limit_from = arvelie_to_offset("06I04");
	int limit_to = get_offset();
	int range_from = arvelie_to_offset(t->date_from);
	int range_to = arvelie_to_offset(t->date_last);
	int i, init = 0, period = (limit_to - limit_from) / 5;
	fputs("<code style='float:right; font-size:80%'>", f);
	for(i = 0; i < 6; i++) {
		float epoch = (i / 5.0) * (limit_to - limit_from) + limit_from;
		if(epoch > range_from && !init) {
		int moment = i * period + limit_from;
		if(moment >= range_from && !init++)
			fputs("+", f);
			init = true;
		} else if(epoch >= range_from && epoch <= range_to) {
		else if(moment >= range_from && moment <= range_to)
			fputs("+", f);
		} else {
		else
			fputs("-", f);
		}
	}
	fputs("</code>", f);
}

void
build_pict(FILE* f, int pict, char* host, char* name, bool caption,
           char* link)
fppict(FILE* f, int pict, char* host, char* name, int caption, char* link)
{
	fputs("<figure>", f);
	fprintf(f, "<img src='../media/diary/%d.jpg' alt='%s picture'/>", pict, name);
	fprintf(f, "<img src='../media/diary/%d.jpg' alt='%s picture' width='900'/>", pict, name);
	if(caption) {
		fputs("<figcaption>", f);
		if(link) {
		if(link)
			fprintf(f, "<a href='%s.html'>%s</a> — %s", link, host, name);
		} else {
		else
			fprintf(f, "%s — %s", host, name);
		}
		fputs("</figcaption>", f);
	}
	fputs("</figure>", f);
}

void
build_term_pict(FILE* f, Term* term, bool caption)
fplogpict(FILE* f, Log* l, int caption)
{
	char filename[STR_BUF_LEN];
	Log* log = find_last_diary(term);
	if(log == NULL) {
		return;
	}
	filenamestr(term->name, filename);
	build_pict(f, log->pict, term->name, term->bref, caption, filename);
	fppict(f, l->pict, l->date, l->name, caption, NULL);
}

void
build_log_pict(FILE* f, Log* log, bool caption)
fplink(FILE* f, Lexicon* lex, Term* t, char* s)
{
	int split = cpos(s, ' ');
	char target[256], name[256];
	/* find target and name */
	if(split == -1)
		scpy(sstr(s, target, 0, slen(s)), name);
	else {
		sstr(s, target, 0, split);
		sstr(s, name, split + 1, slen(s) - split);
	}
	/* output */
	if(surl(target)) {
		if(f)
			fprintf(f, "<a href='%s' target='_blank'>%s</a>", target, name);
	} else {
		Term* tt = findterm(lex, target);
		if(!tt)
			error("Unknown link", target);
		if(f)
			fprintf(f, "<a href='%s.html'>%s</a>", tt->filename, name);
		else {
			tt->incoming[tt->incoming_len++] = t;
			t->outgoing_len++;
		}
	}
}

int
fplist(FILE* f, Glossary* glo, char* target)
{
	build_pict(f, log->pict, log->date, log->name, caption, NULL);
	int j;
	List* l = findlist(glo, target);
	if(!l)
		return error("Unknown list", target);
	fprintf(f, "<h3>%s</h3>", l->name);
	fputs("<ul>", f);
	for(j = 0; j < l->len; ++j)
		if(!l->keys[j])
			fprintf(f, "<li>%s</li>", l->vals[j]);
		else if(surl(l->vals[j]))
			fprintf(f, "<li><a href='%s'>%s</a></li>", l->vals[j], l->keys[j]);
		else
			fprintf(f, "<li><b>%s</b>: %s</li>", l->keys[j], l->vals[j]);
	fputs("</ul>", f);
	l->routes++;
	return 1;
}

void
build_body_part(FILE* f, Term* term)
int
fpinclude(FILE* f, char* target, int text)
{
	int i;
	for(i = 0; i < term->body_len; ++i) {
		fputs(term->body[i], f);
	int lines = 0;
	char c;
	char* folder = text ? "inc/text/" : "inc/html/";
	char* ext = text ? ".txt" : ".htm";
	FILE* fp = getfile(folder, target, ext, "r");
	if(!fp)
		return 0;
	fputs("<figure>", f);
	if(text)
		fputs("<pre>", f);
	while((c = fgetc(fp)) != EOF) {
		if(text) {
			if(c == '<')
				fputs("&lt;", f);
			else if(c == '>')
				fputs("&gt;", f);
			else if(c == '&')
				fputs("&amp;", f);
			else
				fputc(c, f);
		} else
			fputc(c, f);
		if(c == '\n')
			lines++;
	}
	fclose(fp);
	if(text)
		fputs("</pre>", f);
	fprintf(f, "<figcaption>&mdash; Submit an <a href='" REPOPATH "%s%s%s' target='_blank'>edit</a> to <a href='../src/%s%s%s'>%s%s</a>(%d lines)</figcaption>\n", folder, target, ext, folder, target, ext, target, ext, lines);
	fputs("</figure>", f);
	return 1;
}

void
build_nav_part(FILE* f, Term* term, Term* target)
fpmodule(FILE* f, Glossary* glo, char* s)
{
	int i;
	fputs("<ul>", f);
	for(i = 0; i < term->children_len; ++i) {
		char child_filename[STR_BUF_LEN];
		filenamestr(term->children[i]->name, child_filename);
		if(term->children[i]->name == term->name) {
			continue; /* Paradox */
		}
		if(term->children[i]->name == target->name) {
			fprintf(f, "<li><a href='%s.html'>%s/</a></li>", child_filename,
			        term->children[i]->name);
		} else {
			fprintf(f, "<li><a href='%s.html'>%s</a></li>", child_filename,
			        term->children[i]->name);
		}
	}
	fputs("</ul>", f);
	int split = cpos(s, ' ');
	char cmd[256], target[256];
	sstr(s, cmd, 1, split - 1);
	sstr(s, target, split + 1, slen(s) - split);
	if(scmp(cmd, "itchio"))
		fprintf(f, "<iframe frameborder='0' src='https://itch.io/embed/%s?link_color=000000' width='624' height='167'></iframe>", target);
	else if(scmp(cmd, "bandcamp"))
		fprintf(f, "<iframe style='border: 0; width: 624px; height: 274px;' src='https://bandcamp.com/EmbeddedPlayer/album=%s/size=large/bgcol=ffffff/linkcol=333333/artwork=small' seamless></iframe>", target);
	else if(scmp(cmd, "youtube"))
		fprintf(f, "<iframe width='624' height='380' src='https://www.youtube.com/embed/%s?rel=0' style='max-width:700px' frameborder='0' allow='autoplay; encrypted-media' allowfullscreen></iframe>", target);
	else if(scmp(cmd, "redirect"))
		fprintf(f, "<meta http-equiv='refresh' content='2; url=%s.html'/><p>In a hurry? Travel to <a href='%s.html'>%s</a>.</p>", target, target, target);
	else if(scmp(cmd, "list")) {
		fplist(f, glo, target);
	} else if(scmp(cmd, "text")) {
		fpinclude(f, target, 1);
	} else if(scmp(cmd, "html")) {
		fpinclude(f, target, 0);
	} else if(scmp(cmd, "img")) {
		int split2 = cpos(target, ' ');
		if(split2 > 0) {
			char param[256], value[256];
			sstr(target, param, 0, split2);
			sstr(target, value, split2 + 1, slen(target) - split2);
			fprintf(f, "<img src='../media/%s' width='%s'/>&nbsp;", param, value);
		} else
			fprintf(f, "<img src='../media/%s'/>&nbsp;", target);
	} else
		printf("Warning: Missing template mod: %s\n", s);
}

void
build_banner(FILE* f, Term* term, bool caption)
fptemplate(FILE* f, Glossary* glo, Lexicon* lex, Term* t, char* s)
{
	Log* l = find_last_diary(term);
	if(l) {
		build_log_pict(f, l, caption);
	int i, capture = 0;
	char buf[1024];
	buf[0] = '\0';
	for(i = 0; i < slen(s); ++i) {
		char c = s[i];
		if(c == '}') {
			capture = 0;
			if(buf[0] == '^' && f)
				fpmodule(f, glo, buf);
			else if(buf[0] != '^')
				fplink(f, lex, t, buf);
		}
		if(capture)
			ccat(buf, c);
		else if(c != '{' && c != '}' && f)
			fputc(c, f);
		if(c == '{') {
			capture = 1;
			buf[0] = '\0';
		}
	}
}

void
build_nav(FILE* f, Term* term)
fpbodypart(FILE* f, Glossary* glo, Lexicon* lex, Term* t)
{
	if(term->parent == NULL) {
		printf("Warning: Missing parent for %s\n", term->name);
		return;
	}
	if(term->parent->parent == NULL) {
		printf("Warning: Missing parent for %s\n", term->parent->name);
		return;
	}
	fputs("<nav>", f);
	if(term->parent->parent->name == term->parent->name) {
		build_nav_part(f, term->parent->parent, term);
	} else {
		build_nav_part(f, term->parent->parent, term->parent);
	}
	if(term->parent->parent->name != term->parent->name) {
		build_nav_part(f, term->parent, term);
	}
	if(term->parent->name != term->name) {
		build_nav_part(f, term, term);
	}
	fputs("</nav>", f);
	int i;
	for(i = 0; i < t->body_len; ++i)
		fptemplate(f, glo, lex, t, t->body[i]);
}

void
build_body(FILE* f, Term* term)
fpbanner(FILE* f, Journal* jou, Term* t, int caption)
{
	fprintf(f, "<h2>%s</h2>", term->bref);
	build_body_part(f, term);
	Log* l = finddiary(jou, t);
	if(l)
		fplogpict(f, l, caption);
}

void
build_listing(FILE* f, Term* term)
fpnavpart(FILE* f, Term* t, Term* target)
{
	int i, j;
	for(i = 0; i < term->docs_len; ++i) {
		List* l = term->docs[i];
		fprintf(f, "<h3>%s</h3>", l->name);
		fputs("<ul>", f);
		for(j = 0; j < l->pairs_len; ++j) {
			fprintf(f, "<li><b>%s</b>: %s</li>", l->keys[j], l->vals[j]);
		}
		for(j = 0; j < l->items_len; ++j) {
			fprintf(f, "<li>%s</li>", l->items[j]);
		}
		fputs("</ul>", f);
	int i;
	fputs("<ul>", f);
	for(i = 0; i < t->children_len; ++i) {
		Term* tc = t->children[i];
		if(tc->name == t->name)
			continue; /* Paradox */
		if(tc->name == target->name)
			fprintf(f, "<li><a href='%s.html'>%s/</a></li>", tc->filename, tc->name);
		else
			fprintf(f, "<li><a href='%s.html'>%s</a></li>", tc->filename, tc->name);
	}
	fputs("</ul>", f);
}

void
build_include(FILE* f, Term* term)
fpnav(FILE* f, Term* t)
{
	char buffer[4096];
	char filename[STR_BUF_LEN];
	char filepath[STR_BUF_LEN];
	FILE* fp;
	filenamestr(term->name, filename);
	filepath[0] = '\0';
	strcat(filepath, "inc/");
	strcat(filepath, filename);
	strcat(filepath, ".htm\0");
	fp = fopen(filepath, "r");
	if(fp == NULL) {
		return;
	}
	for(;;) {
		size_t sz = fread(buffer, 1, sizeof(buffer), fp);
		if(sz) {
			fwrite(buffer, 1, sz, f);
		} else if(feof(fp) || ferror(fp)) {
			break;
		}
	}
	fprintf(f,
	        "<p>Found a mistake? Submit an <a href='https://git.sr.ht/~exprez135/mountaen/tree/master/src/inc/%s.htm' target='_blank'>patch</a> to %s.</p>",
	        filename, term->name);
	fclose(fp);
	if(!t->parent)
		error("Missing parent", t->name);
	if(!t->parent->parent)
		error("Missing parent", t->parent->name);
	fputs("<nav>", f);
	if(t->parent->parent->name == t->parent->name)
		fpnavpart(f, t->parent->parent, t);
	else
		fpnavpart(f, t->parent->parent, t->parent);
	if(t->parent->parent->name != t->parent->name)
		fpnavpart(f, t->parent, t);
	if(t->parent->name != t->name)
		fpnavpart(f, t, t);
	fputs("</nav>", f);
}

void
build_index(FILE* f, Term* term)
fpbody(FILE* f, Glossary* glo, Lexicon* lex, Term* t)
{
	int i;
	if(strcmp(term->type, "index") != 0) {
		return;
	}
	for(i = 0; i < term->children_len; ++i) {
		char child_filename[STR_BUF_LEN];
		filenamestr(term->children[i]->name, child_filename);
		fprintf(f, "<h3><a href='%s.html'>%s</a></h3>", child_filename,
		        term->children[i]->name);
		build_body_part(f, term->children[i]);
		build_listing(f, term->children[i]);
	}
	fprintf(f, "<h2>%s</h2>", t->bref);
	fpbodypart(f, glo, lex, t);
}

void
build_portal(FILE* f, Term* term)
fpportal(FILE* f, Glossary* glo, Lexicon* lex, Journal* jou, Term* t, int pict, int text)
{
	int i;
	if(strcmp(term->type, "portal") != 0) {
		return;
	}
	for(i = 0; i < term->children_len; ++i) {
		build_term_pict(f, term->children[i], true);
	for(i = 0; i < t->children_len; ++i) {
		Term* tc = t->children[i];
		if(pict) {
			Log* l = finddiary(jou, tc);
			if(l)
				fppict(f, l->pict, tc->name, tc->bref, 1, tc->filename);
		}
		if(text) {
			fprintf(f, "<h2><a href='%s.html'>%s</a></h2>", tc->filename, tc->name);
			fpbodypart(f, glo, lex, tc);
		}
	}
}

void
build_album(FILE* f, Term* term)
fpalbum(FILE* f, Journal* jou, Term* t)
{
	int i;
	Log* header_log;
	if(strcmp(term->type, "album") != 0) {
		return;
	}
	header_log = find_last_diary(term);
	for(i = 0; i < all_logs.len; ++i) {
		Log l = all_logs.logs[i];
		if(l.term != term) {
			continue;
		}
		if(l.pict < 1) {
	for(i = 0; i < jou->len; ++i) {
		Log l = jou->logs[i];
		if(l.term != t || l.pict < 1 || l.pict == finddiary(jou, t)->pict)
			continue;
		}
		if(l.pict == header_log->pict) {
			continue;
		}
		build_log_pict(f, &l, true);
		fplogpict(f, &l, 1);
	}
}

void
build_links(FILE* f, Term* term)
fplinks(FILE* f, Term* t)
{
	int i;
	if(term->link_len < 1) {
	if(t->link.len < 1)
		return;
	}
	fputs("<ul>", f);
	for(i = 0; i < term->link_len; ++i) {
		fprintf(f, "<li><a href='%s' target='_blank'>%s</a></li>",
		        term->link_vals[i], term->link_keys[i]);
	}
	for(i = 0; i < t->link.len; ++i)
		fprintf(f, "<li><a href='%s' target='_blank'>%s</a></li>", t->link.vals[i], t->link.keys[i]);
	fputs("</ul>", f);
}

void
build_incoming(FILE* f, Term* term)
fpincoming(FILE* f, Term* t)
{
	int i;
	char filename[STR_BUF_LEN];
	if(term->incoming_len < 1) {
	if(t->incoming_len < 1)
		return;
	}
	fputs("<p>", f);
	fprintf(f, "<i>incoming(%d)</i>: ", term->incoming_len);
	for(i = 0; i < term->incoming_len; ++i) {
		filenamestr(term->incoming[i]->name, filename);
		fprintf(f, "<a href='%s.html'>%s</a> ", filename, term->incoming[i]->name);
	}
	fprintf(f, "<i>incoming(%d)</i>: ", t->incoming_len);
	for(i = 0; i < t->incoming_len; ++i)
		fprintf(f, "<a href='%s.html'>%s</a> ", t->incoming[i]->filename, t->incoming[i]->name);
	fputs("</p>", f);
}

void
build_horaire(FILE* f, Term* term)
fphoraire(FILE* f, Journal* jou, Term* t)
{
	int i;
	int len = 0;
	int events_len = 0;
	int ch = 0;
	int fh = 0;
	for(i = 0; i < all_logs.len; ++i) {
		Log* l = &all_logs.logs[i];
		if(l->term != term && l->term->parent != term) {
			continue;
		}
		if(l->is_event == true) {
			events_len++;
		}
		ch += (l->code / 10) % 10;
		fh += l->code % 10;
		len++;
	}
	/* Updated */
	if(len < 2 || strlen(term->date_last) == 0) {
	if(t->logs_len < 2 || !t->date_last)
		return;
	}
	fputs("<p>", f);
	fprintf(f,
	        "<i>"
	        "Last update on <a href='tracker.html'>%s</a>, edited %d times. "
	        "+%d/%dfh"
	        "</i>",
	        term->date_last, len, ch, fh);
	build_lifeline(f, term);
	fprintf(f, "<i>Last update on <a href='tracker.html'>%s</a>, edited %d times. +%d/%dfh</i>", t->date_last, t->logs_len, t->ch, t->fh);
	fplifeline(f, t);
	fputs("</p>", f);
	/* Events */
	if(events_len < 1) {
	if(t->events_len < 1)
		return;
	}
	fputs("<ul>", f);
	for(i = 0; i < all_logs.len; ++i) {
		Log* l = &all_logs.logs[i];
		if(l->term != term && l->term->parent != term) {
	for(i = 0; i < jou->len; ++i) {
		Log* l = &jou->logs[i];
		if(l->rune != '+')
			continue;
		}
		if(l->is_event != true) {
		if(l->term != t && l->term->parent != t)
			continue;
		}
		fprintf(f, "<li>%s — %s</li>", l->date, l->name);
	}
	fputs("</ul>", f);
}

void
build_special_home(FILE* f, Journal* journal)
fphome(FILE* f, Journal* jou)
{
	int i;
	bool found_events;
	found_events = false;
	int i, events = 0;
	for(i = 0; i < 5; ++i) {
		if(journal->logs[i].is_event == true) {
			found_events = true;
		if(jou->logs[i].rune == '+') {
			events = 1;
			break;
		}
	}
	if(!found_events) {
	if(!events)
		return;
	}
	fputs("<h2>Events</h2>", f);
	fputs("<ul>", f);
	for(i = 0; i < 5; ++i) {
		char filename[STR_BUF_LEN];
		if(journal->logs[i].is_event != true) {
		if(jou->logs[i].rune != '+')
			continue;
		}
		filenamestr(journal->logs[i].term->name, filename);
		fprintf(f, "<li><a href='%s.html'>%s</a> %s</li>", filename,
		        journal->logs[i].date, journal->logs[i].name);
		fprintf(f, "<li><a href='%s.html'>%s</a> %s</li>", jou->logs[i].term->filename, jou->logs[i].date, jou->logs[i].name);
	}
	fputs("</ul>", f);
}

void
build_special_calendar(FILE* f, Journal* journal)
fpcalendar(FILE* f, Journal* jou)
{
	int i;
	int last_year = 0;
	int i, last_year = 0;
	fputs("<ul>", f);
	for(i = 0; i < journal->len; ++i) {
		char filename[STR_BUF_LEN];
		if(journal->logs[i].is_event != true) {
	for(i = 0; i < jou->len; ++i) {
		if(jou->logs[i].rune != '+')
			continue;
		}
		if(last_year != extract_year(journal->logs[i].date)) {
		if(last_year != sint(jou->logs[i].date, 2))
			fprintf(f, "</ul><ul>");
		}
		filenamestr(journal->logs[i].term->name, filename);
		fprintf(f, "<li><a href='%s.html'>%s</a> %s</li>", filename,
		        journal->logs[i].date, journal->logs[i].name);
		last_year = extract_year(journal->logs[i].date);
		fprintf(f, "<li><a href='%s.html'>%s</a> %s</li>", jou->logs[i].term->filename, jou->logs[i].date, jou->logs[i].name);
		last_year = sint(jou->logs[i].date, 2);
	}
	fputs("</ul>", f);
}

void
build_special_tracker(FILE* f, Journal* journal)
fptracker(FILE* f, Journal* jou)
{
	int i;
	int known_id = 0;
	int last_year = 20;
	char* known[LEXMEM];
	int i, known_id = 0, last_year = 20, offset = get_offset();
	fputs("<ul>", f);
	for(i = 0; i < journal->len; ++i) {
		char filename[STR_BUF_LEN];
		char* known[LEXICON_BUFFER];
		if(index_of_string(known, known_id, journal->logs[i].term->name) > -1) {
	for(i = 0; i < jou->len; ++i) {
		Log* l = &jou->logs[i];
		if(offset - arvelie_to_offset(l->date) < 0)
			continue;
		}
		if(known_id >= LEXICON_BUFFER) {
			printf("Warning: Reached tracker buffer\n");
			break;
		}
		if(last_year != extract_year(journal->logs[i].date)) {
		if(afnd(known, known_id, l->term->name) > -1)
			continue;
		if(last_year != sint(l->date, 2))
			fprintf(f, "</ul><ul>");
		}
		filenamestr(journal->logs[i].term->name, filename);
		fputs("<li>", f);
		fprintf(f, "<a href='%s.html'>%s</a> — last update %s", filename,
		        journal->logs[i].term->name, journal->logs[i].date);
		build_lifeline(f, journal->logs[i].term);
		fprintf(f, "<a href='%s.html'>%s</a> — last update %s", l->term->filename, l->term->name, l->date);
		fplifeline(f, l->term);
		fputs("</li>", f);

		last_year = extract_year(journal->logs[i].date);
		known[known_id] = journal->logs[i].term->name;
		last_year = sint(l->date, 2);
		known[known_id] = l->term->name;
		known_id++;
	}
	fputs("</ul>", f);
}

void
build_special_journal(FILE* f, Journal* journal)
fpjournal(FILE* f, Journal* jou)
{
	int i, count = 0;
	for(i = 0; i < journal->len; ++i) {
		if(count > 20) {
	for(i = 0; i < jou->len; ++i) {
		if(count > 20)
			break;
		}
		if(journal->logs[i].pict == 0) {
		if(jou->logs[i].pict == 0)
			continue;
		}
		build_log_pict(f, &journal->logs[i], true);
		fplogpict(f, &jou->logs[i], 1);
		count++;
	}
}

void
build_special_now(FILE* f, Journal* journal)
fpnow(FILE* f, Lexicon* lex, Journal* jou)
{
	int i, epoch, index = 0, projects_len = 0;
	Log l;
	char filename[STR_BUF_LEN];
	char* projects_name[LOGS_RANGE];
	double projects_value[LOGS_RANGE];
	double sum_value = 0;
	epoch = get_epoch();
	int i, projects_len = 0;
	char *pname[LOGS_RANGE], *pfname[LOGS_RANGE];
	double sum_value = 0, pval[LOGS_RANGE], pmaxval = 0;
	time_t now;
	time(&now);
	for(i = 0; i < LOGS_RANGE; ++i) {
		l = journal->logs[i];
		if(epoch - arvelie_to_epoch(l.date) > LOGS_RANGE) {
		int index = 0;
		Log l = jou->logs[i];
		if(arvelie_to_offset(l.date) < LOGS_RANGE)
			break;
		}
		index = index_of_string(projects_name, projects_len, l.term->name);
		if(l.code % 10 < 1)
			continue;
		index = afnd(pname, projects_len, l.term->name);
		if(index < 0) {
			index = projects_len;
			projects_name[index] = l.term->name;
			projects_value[index] = 0;
			pname[index] = l.term->name;
			pfname[index] = l.term->filename;
			pval[index] = 0;
			projects_len++;
		}
		projects_value[index] += l.code % 10;
		pval[index] += l.code % 10;
		sum_value += l.code % 10;
	}
	/* find most active with a photo */
	for(i = 0; i < projects_len; ++i) {
		if(finddiary(jou, findterm(lex, pname[i])) && pval[i] > pmaxval)
			pmaxval = pval[i];
	}
	for(i = 0; i < projects_len; ++i) {
		if(pval[i] != pmaxval)
			continue;
		fplogpict(f, finddiary(jou, findterm(lex, pname[i])), 1);
		break;
	}
	fprintf(
	    f,
	    "<p>Distribution of <b>%.0f hours for %d projects</b>, over the past %d days, for an average of %.2f hours per day and %.2f hours per project.</p>",
	    sum_value, projects_len, LOGS_RANGE, sum_value / LOGS_RANGE, sum_value / projects_len);
	    "<p>This data shows the distribution of <b>%.0f hours over %d projects</b>, "
	    "recorded during the last %d days, for an average of %.1f work hours per day "
	    "and %.1f work hours per project.</p>",
	    sum_value,
	    projects_len,
	    LOGS_RANGE,
	    sum_value / LOGS_RANGE,
	    sum_value / projects_len);
	fputs("<ul style='columns:2'>", f);
	for(i = 0; i < projects_len; ++i) {
		filenamestr(projects_name[i], filename);
		fputs("<li>", f);
		fprintf(f, "<a href='%s.html'>%s</a> %.2f&#37; ",
		        filename,
		        projects_name[i],
		        projects_value[i] / sum_value * 100);
		fprintf(f, "<a href='%s.html'>%s</a> %.2f&#37; ", pfname[i], pname[i], pval[i] / sum_value * 100);
		fputs("</li>", f);
	}
	fputs("</ul>", f);
	fprintf(f, "<p>Last generated on %s(Tulsa, Oklahoma).</p>", nowstr());
	fprintf(f, "<p>Last generated on %s(" LOCATION ").</p>", ctime(&now));
}

void
print_term_details(FILE* f, Term* term, int depth)
fpdetails(FILE* f, Term* t, int depth)
{
	int i;
	char filename[STR_BUF_LEN];
	depth++;
	filenamestr(term->name, filename);
	fprintf(f, "<li><a href='%s.html'>%s</a></li>", filename, term->name);
	if(term->children_len < 1) {
	fprintf(f, "<li><a href='%s.html'>%s</a> <i>%s</i></li>", t->filename, t->name, t->body_len < 1 ? "stub" : t->incoming_len < 1 ? "orphan "
	                                                                                                       : t->outgoing_len < 1   ? "deadend "
	                                                                                                                               : "");
	if(t->children_len < 1)
		return;
	}
	fputs("<ul>", f);
	for(i = 0; i < term->children_len; ++i) {
		if(strcmp(term->children[i]->name, term->name) != 0) {
			print_term_details(f, term->children[i], depth);
		}
	}
	for(i = 0; i < t->children_len; ++i)
		if(!scmp(t->children[i]->name, t->name))
			fpdetails(f, t->children[i], depth++);
	fputs("</ul>", f);
}

void
build_special_index(FILE* f, Term* term)
fpindex(FILE* f, Lexicon* lex, Journal* jou)
{
	if(strcmp(term->name, "index") != 0) {
		return;
	int i, sends = 0, stubs = 0, orphans = 0, deadends = 0;
	for(i = 0; i < lex->len; ++i) {
		Term* t = &lex->terms[i];
		sends += t->incoming_len;
		if(t->body_len < 1)
			stubs++;
		if(t->incoming_len < 1)
			orphans++;
		if(t->outgoing_len < 1)
			deadends++;
	}
	fprintf(f, "<p>This wiki hosts %d journal logs recorded on %d lexicon terms, connected by %d inbound links. It is a living document in which %d stubs, %d orphans and %d deadends still remain.</p>", jou->len, lex->len, sends, stubs, orphans, deadends);
	fputs("<ul>", f);
	print_term_details(f, &all_terms.terms[0], 0);
	fpdetails(f, &lex->terms[0], 0);
	fputs("</ul>", f);
}

void
build_page(Term* term, Journal* journal)
fphtml(FILE* f, Glossary* glo, Lexicon* lex, Term* t, Journal* jou)
{
	FILE* f;
	char filename[STR_BUF_LEN];
	char filepath[STR_BUF_LEN];
	filenamestr(term->name, filename);
	filepath[0] = '\0';
	strcat(filepath, "../site/");
	strcat(filepath, filename);
	strcat(filepath, ".html\0");
	f = fopen(filepath, "w");
	fprintf(f, "<!DOCTYPE html>"
	           "<html lang='en'>"
	           "<head>"
	           "<meta charset='utf-8'>"
	fputs("<!DOCTYPE html><html lang='en'>", f);
	fputs("</head>", f);
	fprintf(f, "<meta charset='utf-8'>"
	           "<meta name='description' content='%s'/>"
	           "<meta name='thumbnail' content='https://wiki.ijams.me/media/services/thumbnail.jpg' />"
	           "<meta name='thumbnail' content='" DOMAIN "media/services/thumbnail.jpg' />"
	           "<meta name='viewport' content='width=device-width,initial-scale=1'>"
	           "<link rel='alternate' type='application/rss+xml' title='RSS Feed' href='../links/rss.xml' />"
	           "<link rel='stylesheet' type='text/css' href='../links/main.css'>"
	           "<link rel='shortcut icon' type='image/png' href='../media/services/icon.png'>"
	           "<title>Tellurium — %s</title>"
	           "</head>"
	           "<body>",
	        term->bref, term->name);
	fputs("<header><a href='home.html'><img src='../media/icon/logo.svg' alt='Tellurium'></a></header>", f);
	build_nav(f, term);
	           "<title>" NAME " — %s</title>",
	        t->bref,
	        t->name);
	fputs("</head>", f);
	fputs("<body>", f);
	fputs("<header><a href='home.html'><img src='../media/icon/logo.svg' alt='" NAME "' height='29'></a></header>", f);
	fpnav(f, t);
	fputs("<main>", f);
	build_banner(f, term, true);
	build_body(f, term);
	build_include(f, term);
	build_listing(f, term);
	build_index(f, term);
	build_portal(f, term);
	build_album(f, term);
	if(strcmp(term->name, "now") == 0) {
		build_special_now(f, journal);
	} else if(strcmp(term->name, "home") == 0) {
		build_special_home(f, journal);
	} else if(strcmp(term->name, "calendar") == 0) {
		build_special_calendar(f, journal);
	} else if(strcmp(term->name, "tracker") == 0) {
		build_special_tracker(f, journal);
	} else if(strcmp(term->name, "journal") == 0) {
		build_special_journal(f, journal);
	} else if(strcmp(term->name, "index") == 0) {
		build_special_index(f, term);
	fpbanner(f, jou, t, 1);
	fpbody(f, glo, lex, t);
	fpinclude(f, t->filename, 0);
	/* templated pages */
	if(t->type) {
		if(scmp(t->type, "pict_portal"))
			fpportal(f, glo, lex, jou, t, 1, 0);
		else if(scmp(t->type, "text_portal"))
			fpportal(f, glo, lex, jou, t, 0, 1);
		else if(scmp(t->type, "album"))
			fpalbum(f, jou, t);
		else
			error("Unknown template", t->type);
	}
	build_links(f, term);
	build_incoming(f, term);
	build_horaire(f, term);
	/* special pages */
	if(scmp(t->name, "now"))
		fpnow(f, lex, jou);
	else if(scmp(t->name, "home"))
		fphome(f, jou);
	else if(scmp(t->name, "calendar"))
		fpcalendar(f, jou);
	else if(scmp(t->name, "tracker"))
		fptracker(f, jou);
	else if(scmp(t->name, "journal"))
		fpjournal(f, jou);
	else if(scmp(t->name, "index"))
		fpindex(f, lex, jou);
	fplinks(f, t);
	fpincoming(f, t);
	fphoraire(f, jou, t);
	fputs("</main>", f);
	fputs("<footer>"
	      "<a href='https://creativecommons.org/licenses/by-nc-sa/4.0'>"
	      "<img src='../media/icon/cc.svg' alt='creative commons'/></a>"
	      "</a>"
	      "<a href='https://fosstodon.org/@exprez135'>"
	      "<img src='../media/icon/fosstodon.png' alt='exprez135@fosstodon.org'/>"
	      "</a>"
	      "<a href='https://git.sr.ht/~exprez135'>"
	      "<img src='../media/icon/sourcehut.svg' alt='sourcehut'/>"
	      "</a>"
	      "<span>"
	      "<a href='nathaniel_ijams.html'>Nathaniel Ijams</a> © 2020 "
	      "— <a href='about.html'>BY-NC-SA 4.0</a>"
	      "</span>"
	      "</footer></body></html>",
	      f);
	fputs("<footer>", f);
	fputs("<a href='https://creativecommons.org/licenses/by-nc-sa/4.0'><img src='../media/icon/cc.svg' width='30'/></a>", f);
	fputs("<a href='http://webring.xxiivv.com/'><img src='../media/icon/rotonde.svg' width='30'/></a>", f);
	fputs("<a href='https://merveilles.town/@neauoire'><img src='../media/icon/merveilles.svg' width='30'/></a>", f);
	fputs("<a href='https://github.com/neauoire'><img src='../media/icon/github.png' alt='github' width='30'/></a>", f);
	fputs("<span><a href='devine_lu_linvega.html'>Devine Lu Linvega</a> © 2020 — <a href='about.html'>BY-NC-SA 4.0</a></span>", f);
	fputs("</footer>", f);
	fputs("</body></html>", f);
	fclose(f);
}

void
build_rss(Journal* journal)
fprss(FILE* f, Journal* jou)
{
	int i;
	time_t now;
	FILE* f = fopen("../links/rss.xml", "w");
	fputs("<?xml version='1.0' encoding='UTF-8' ?>\n", f);
	fputs("<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1/'>\n", f);
	fputs("<channel>\n", f);
	fputs("<title>Tellurium</title>\n", f);
	fputs("<link>https://wiki.ijams.me/Journal</link>\n", f);
	fputs("<description>The Latourian Library</description>\n", f);
	fputs("<title>" NAME "</title>\n", f);
	fputs("<link>" DOMAIN "Journal</link>\n", f);
	fputs("<description>The Nataniev Library</description>\n", f);
	/* Date */
	fputs("<lastBuildDate>", f);
	fputs_rfc2822(f, time(&now));
	fpRFC2822(f, time(&now));
	fputs("</lastBuildDate>\n", f);
	/* Image */
	fputs("<image>\n", f);
	fputs("  <url>https://wiki.ijams.me/media/services/rss.jpg</url>\n", f);
	fputs("  <title>The Latourian Library</title>\n", f);
	fputs("  <link>https://wiki.ijams.me/Journal</link>\n", f);
	fputs("  <url>" DOMAIN "media/services/rss.jpg</url>\n", f);
	fputs("  <title>The Nataniev Library</title>\n", f);
	fputs("  <link>" DOMAIN "Journal</link>\n", f);
	fputs("</image>\n", f);
	for(i = 0; i < journal->len; ++i) {
		char filename[STR_BUF_LEN];
		Log l = journal->logs[i];
		if(l.pict == 0) {
	for(i = 0; i < jou->len; ++i) {
		Log l = jou->logs[i];
		if(l.pict == 0)
			continue;
		}
		filenamestr(l.term->name, filename);
		fputs("<item>\n", f);
		fprintf(f, "  <title>%s</title>\n", l.name);
		fprintf(f, "  <link>https://wiki.ijams.me/site/%s.html</link>\n",
		        filename);
		fprintf(f, "  <link>" DOMAIN "site/%s.html</link>\n", l.term->filename);
		fprintf(f, "  <guid isPermaLink='false'>%d</guid>\n", l.pict);
		fputs("  <pubDate>", f);
		fputs_rfc2822(f, arvelie_to_time(l.date));
		fpRFC2822(f, arvelie_to_time(l.date));
		fputs("</pubDate>\n", f);
		fputs("  <dc:creator><![CDATA[Nathaniel Ijams]]></dc:creator>\n", f);
		fputs("  <dc:creator><![CDATA[Devine Lu Linvega]]></dc:creator>\n", f);
		fputs("  <description>\n", f);
		fputs("<![CDATA[", f);
		fprintf(f, "<img src='https://wiki.ijams.me/media/diary/%d.jpg'/>\n",
		        l.pict);
		fprintf(f,
		        "<p>%s<br/><br/><a href='https://wiki.ijams.me/site/%s.html'>%s</a></p>",
		        l.term->bref, filename, l.term->name);
		fprintf(f, "<img src='" DOMAIN "media/diary/%d.jpg'/>\n", l.pict);
		fprintf(f, "<p>%s<br/><br/><a href='" DOMAIN "site/%s.html'>%s</a></p>", l.term->bref ? l.term->bref : "", l.term->filename, l.term->name);
		fputs("]]>\n", f);
		fputs("  </description>\n", f);
		fputs("</item>\n", f);


@@ 750,435 788,246 @@ build_rss(Journal* journal)
	fclose(f);
}

FILE*
parse_glossary(FILE* fp, Glossary* glossary)
void
fptwtxt(FILE* f, Journal* jou)
{
	int key_len;
	int val_len;
	int len, pad, count = 0;
	char line[512];
	while(fgets(line, 512, fp)) {
		pad = count_leading_spaces(line);
		trimstr(line);
		len = strlen(line);
		if(len < 4 || line[0] == ';') {
	int i;
	for(i = 0; i < jou->len; ++i) {
		Log l = jou->logs[i];
		if(l.rune != '+')
			continue;
		}
		if(len > 400) {
			printf("Warning: Line is too long(%d characters) %s\n", len, line);
		fpRFC3339(f, arvelie_to_time(l.date));
		fprintf(f, "\t%s | " DOMAIN "%s\n", l.name, l.term->filename);
	}
	fclose(f);
}

int
parse_glossary(FILE* fp, Block* block, Glossary* glo)
{
	int len, depth, count = 0, split = 0;
	char line[512], buf[1024];
	List* l = &glo->lists[glo->len];
	while(fgets(line, 512, fp)) {
		depth = cpad(line, '\t');
		len = slen(strm(line));
		count++;
		if(len < 4 || line[0] == ';')
			continue;
		}
		if(pad == 0) {
			List* l = &glossary->lists[glossary->len];
			substr(line, l->name, 0, len);
			if(!isalphanumstr(l->name)) {
				printf("Warning: %s is not alphanum\n", l->name);
			}
			lcstr(l->name);
			glossary->len++;
		} else if(pad == 2) {
			List* l = &glossary->lists[glossary->len - 1];
			if(strstr(line, " : ") != NULL) {
				key_len = indexchr(line, ':') - 3;
				substr(line, l->keys[l->pairs_len], 2, key_len);
				val_len = len - key_len - 5;
				substr(line, l->vals[l->pairs_len], key_len + 5, val_len);
				l->pairs_len++;
			} else {
				substr(line, l->items[l->items_len], 2, len);
				l->items_len++;
		if(glo->len >= GLOMEM)
			return error("Increase memory", "glossary");
		if(len > 400)
			return error("Line is too long", line);
		if(depth == 0) {
			l = _list(&glo->lists[glo->len++], push(block, sstr(line, buf, 0, len)));
		} else if(depth == 1) {
			if(l->len >= 64)
				error("Reached list item limit", l->name);
			split = cpos(line, ':');
			if(split < 0)
				l->vals[l->len] = push(block, sstr(line, buf, 1, len + 1));
			else {
				l->keys[l->len] = push(block, sstr(line, buf, 1, split - 2));
				l->vals[l->len] = push(block, sstr(line, buf, split + 2, len - split));
			}
			l->len++;
		}
		count++;
	}
	printf("(%d lines) ", count);
	return fp;
	printf(":%d ", count);
	return 1;
}

FILE*
parse_lexicon(FILE* fp, Lexicon* lexicon)
int
parse_lexicon(FILE* fp, Block* block, Lexicon* lex)
{
	char line[1024];
	int key_len;
	int val_len;
	int len, count = 0;
	bool catch_body = false;
	bool catch_link = false;
	bool catch_list = false;
	int key_len, val_len, len, count = 0, catch_body = 0, catch_link = 0;
	char line[1024], buf[1024];
	Term* t = &lex->terms[lex->len];
	while(fgets(line, 1024, fp)) {
		int pad = count_leading_spaces(line);
		trimstr(line);
		len = strlen(line);
		if(len < 3 || line[0] == ';') {
			continue;
		}
		if(len > 750) {
			printf("Warning: Line is too long(%d characters): %s \n", len, line);
		int depth = cpad(line, '\t');
		strm(line);
		len = slen(line);
		count++;
		if(len < 3 || line[0] == ';')
			continue;
		}
		if(pad == 0) {
			Term* t = &lexicon->terms[lexicon->len];
			substr(line, t->name, 0, len);
			if(!isalphanumstr(t->name)) {
				printf("Warning: %s is not alphanum\n", t->name);
			}
			lcstr(t->name);
			lexicon->len++;
		} else if(pad == 2) {
			Term* t = &lexicon->terms[lexicon->len - 1];
			if(strstr(line, "HOST : ") != NULL) {
				substr(line, t->host, 9, len - 9);
			}
			if(strstr(line, "BREF : ") != NULL) {
				substr(line, t->bref, 9, len - 9);
			}
			if(strstr(line, "TYPE : ") != NULL) {
				substr(line, t->type, 9, len - 9);
			}
			catch_body = strstr(line, "BODY") != NULL;
			catch_link = strstr(line, "LINK") != NULL;
			catch_list = strstr(line, "LIST") != NULL;
		} else if(pad == 4) {
			Term* t = &lexicon->terms[lexicon->len - 1];
		if(lex->len >= LEXMEM)
			return error("Increase memory", "Lexicon");
		if(len > 750)
			return error("Line is too long", line);
		if(depth == 0) {
			t = _term(&lex->terms[lex->len++], push(block, sstr(line, buf, 0, len)));
			if(!sans(line))
				return error("Lexicon key is not alphanum", line);
			t->filename = push(block, scsw(slca(sstr(line, buf, 0, len)), ' ', '_'));
		} else if(depth == 1 && len > 2) {
			if(spos(line, "HOST : ") >= 0)
				t->host = push(block, sstr(line, buf, 8, len - 8));
			if(spos(line, "BREF : ") >= 0)
				t->bref = push(block, sstr(line, buf, 8, len - 8));
			if(spos(line, "TYPE : ") >= 0)
				t->type = push(block, sstr(line, buf, 8, len - 8));
			catch_body = spos(line, "BODY") >= 0;
			catch_link = spos(line, "LINK") >= 0;
		} else if(depth == 2 && len > 3) {
			/* Body */
			if(catch_body) {
				substr(line, t->body[t->body_len], 4, len - 4);
				t->body_len++;
			}
			if(catch_body)
				t->body[t->body_len++] = push(block, sstr(line, buf, 2, len - 2));
			/* Link */
			if(catch_link) {
				key_len = indexchr(line, ':') - 5;
				substr(line, t->link_keys[t->link_len], 4, key_len);
				val_len = len - key_len - 5;
				substr(line, t->link_vals[t->link_len], key_len + 7, val_len);
				t->link_len++;
			}
			/* List */
			if(catch_list) {
				substr(line, t->list[t->list_len], 4, len - 4);
				t->list_len++;
			}
		}
		count++;
			else if(catch_link) {
				key_len = cpos(line, ':') - 3;
				t->link.keys[t->link.len] = push(block, sstr(line, buf, 2, key_len));
				val_len = len - key_len - 3;
				t->link.vals[t->link.len++] = push(block, sstr(line, buf, key_len + 5, val_len));
			} else
				error("Invalid line", line);
		} else
			error("Invalid line", line);
	}
	printf("(%d lines) ", count);
	return fp;
	printf(":%d ", count);
	return 1;
}

FILE*
parse_horaire(FILE* fp, Journal* journal)
int
parse_journal(FILE* fp, Block* block, Lexicon* lex, Journal* jou)
{
	int len, count = 0;
	char line[STR_BUF_LEN];
	char codebuff[4];
	Log* l;
	while(fgets(line, STR_BUF_LEN, fp)) {
		trimstr(line);
		len = strlen(line);
		if(len < 14 || line[0] == ';') {
			continue;
		}
		if(len > 72) {
			printf("Warning: Entry is too long %s\n", line);
			continue;
		}
		l = &journal->logs[journal->len];
		/* Date */
		substr(line, l->date, 0, 5);
		/* Rune */
		substr(line, l->rune, 6, 1);
		l->is_event = !strcmp(l->rune, "+");
		/* Code */
		substr(line, codebuff, 7, 3);
		l->code = atoi(codebuff);
		/* Term */
		substr(line, l->host, 11, 21);
		trimstr(l->host);
		if(!isalphanumstr(l->host)) {
			printf("Warning: %s is not alphanum\n", l->host);
		}
		/* Pict */
		if(len >= 35) {
			char pictbuff[4];
			substr(line, pictbuff, 32, 3);
			l->pict = atoi(pictbuff);
		}
		/* Name */
		if(len >= 38) {
			substr(line, l->name, 36, 30);
			trimstr(l->name);
		}
		journal->len++;
	char line[256], buf[256];
	Log* l = &jou->logs[jou->len];
	while(fgets(line, 256, fp)) {
		len = slen(strm(line));
		count++;
		if(len < 14 || line[0] == ';')
			continue;
		if(jou->len >= HORMEM)
			return error("Increase memory", "Horaire");
		if(len > 80)
			return error("Log is too long", line);
		l = _log(&jou->logs[jou->len++], push(block, sstr(line, buf, 0, 5)));
		l->rune = line[6];
		l->code = sint(line + 7, 3);
		l->term = findterm(lex, strm(sstr(line, buf, 11, 21)));
		if(!l->term)
			return error("Unknown log term", line);
		if(len >= 35)
			l->pict = sint(line + 32, 3);
		if(len >= 38)
			l->name = push(block, strm(sstr(line, buf, 36, 72)));
	}
	printf("(%d lines) ", count);
	return fp;
	printf(":%d ", count);
	return 1;
}

void
parse(void)
int
parse(Block* block, Glossary* glo, Lexicon* lex, Journal* jou)
{
	FILE* fglo = fopen("database/glossary.ndtl", "r");
	FILE* flex = fopen("database/lexicon.ndtl", "r");
	FILE* fhor = fopen("database/journal.tbtl", "r");
	printf("Parsing  | ");
	printf("glossary");
	fclose(parse_glossary(fopen("database/glossary.ndtl", "r"), &all_lists));
	printf("lexicon");
	fclose(parse_lexicon(fopen("database/lexicon.ndtl", "r"), &all_terms));
	printf("horaire");
	fclose(parse_horaire(fopen("database/horaire.tbtl", "r"), &all_logs));
}

void
link(void)
{
	int i, j;
	printf("Linking  | ");
	printf("journal(%d entries) ", all_logs.len);
	for(i = 0; i < all_logs.len; ++i) {
		Log* l = &all_logs.logs[i];
		l->term = find_term(&all_terms, l->host);
		if(!l->term) {
			printf("Error: Unknown log host %s\n", l->host);
			exit(0);
		} else {
			if(strlen(l->term->date_last) == 0) {
				cpystr(l->date, l->term->date_last);
			}
			cpystr(l->date, l->term->date_from);
		}
	}
	printf("lexicon(%d entries) ", all_terms.len);
	for(i = 0; i < all_terms.len; ++i) {
		Term* t = &all_terms.terms[i];
		t->parent = find_term(&all_terms, t->host);
		if(!t->parent) {
			printf("Error: Unknown term host %s\n", t->host);
			exit(0);
		}
		t->parent->children[t->parent->children_len] = t;
		t->parent->children_len++;
	}
	printf("glossary(%d entries) ", all_lists.len);
	for(i = 0; i < all_terms.len; ++i) {
		Term* t = &all_terms.terms[i];
		for(j = 0; j < t->list_len; ++j) {
			List* l = find_list(&all_lists, t->list[j]);
			if(!l) {
				printf("Error: Unknown list \"%s\" for %s\n", t->list[j], t->name);
				exit(0);
			}
			t->docs[t->docs_len] = l;
			t->docs_len++;
			l->links_len++;
		}
	}
}

void
template_mods(char* src, char* dest)
{
	int split, targetsplit;
	char target[256], params[256];
	split = indexchr(src, ' ');
	substr(src, target, split + 1, strlen(src) - split - 2);
	targetsplit = indexchr(target, ' ');
	if(targetsplit > 0) {
		substr(target, params, targetsplit + 1, strlen(target) - targetsplit - 1);
		substr(src, target, split + 1, targetsplit);
	if(!fglo || !parse_glossary(fglo, block, glo)) {
		fclose(fglo);
		return error("Parsing", "Glossary");
	}
	/* create new string */
	dest[0] = '\0';
	if(strstr(src, "^itchio") != NULL) {
		strcat(dest, "<iframe frameborder='0' src='https://itch.io/embed/");
		strcat(dest, target);
		strcat(dest, "?link_color=000000' width='600' height='167'></iframe>");
	} else if(strstr(src, "^bandcamp") != NULL) {
		strcat(dest, "<iframe style='border: 0; width: 600px; height: 274px;' src='https://bandcamp.com/EmbeddedPlayer/album=");
		strcat(dest, target);
		strcat(dest, "/size=large/bgcol=ffffff/linkcol=333333/artwork=small' seamless></iframe>");
	} else if(strstr(src, "^youtube") != NULL) {
		strcat(dest, "<iframe width='600' height='380' src='https://www.youtube.com/embed/");
		strcat(dest, target);
		strcat(dest, "?rel=0' style='max-width:700px' frameborder='0' allow='autoplay; encrypted-media' allowfullscreen></iframe>");
	} else if(strstr(src, "^redirect") != NULL) {
		strcat(dest, "<meta http-equiv='refresh' content='2; url=");
		strcat(dest, target);
		strcat(dest, ".html' />");
		strcat(dest, "<p>In a hurry? Travel to <a href='");
		strcat(dest, target);
		strcat(dest, ".html'>");
		strcat(dest, target);
		strcat(dest, "</a>.</p>");
	} else if(strstr(src, "^img") != NULL) {
		if(targetsplit > 0) {
			strcat(dest, "<img src='../media/");
			strcat(dest, target);
			strcat(dest, "' width='");
			strcat(dest, params);
			strcat(dest, "'/>");
		} else {
			strcat(dest, "<img src='../media/");
			strcat(dest, target);
			strcat(dest, "'/>");
		}
	} else {
		printf("Warning: Missing template mod: %s\n", src);
	}
}

void
template_link(char* src, char* dest)
{
	int split = indexchr(src, ' ');
	char target[256], name[256];
	/* find target and name */
	if(split == -1) {
		substr(src, target, 1, strlen(src) - 2);
		cpystr(target, name);
	} else {
		substr(src, target, 1, split - 1);
		substr(src, name, split + 1, strlen(src) - split - 2);
	printf("lexicon");
	if(!flex || !parse_lexicon(flex, block, lex)) {
		fclose(flex);
		return error("Parsing", "Lexicon");
	}
	/* create new string */
	dest[0] = '\0';
	if(isurlstr(target)) {
		strcat(dest, "<a href='");
		strcat(dest, target);
		strcat(dest, "' target='_blank'>");
		strcat(dest, name);
		strcat(dest, "</a>");
	} else {
		if(!find_term(&all_terms, target)) {
			printf("Warning: Unknown link(%s:%s)\n", target, name);
			strcat(dest, target);
		} else {
			strcat(dest, "<a href='");
			filenamestr(target, target);
			strcat(dest, target);
			strcat(dest, ".html'>");
			strcat(dest, name);
			strcat(dest, "</a>");
		}
	printf("journal");
	if(!fhor || !parse_journal(fhor, block, lex, jou)) {
		fclose(fhor);
		return error("Parsing", "Horaire");
	}
	fclose(fglo);
	fclose(flex);
	fclose(fhor);
	return 1;
}

void
template_seg(Term* term, char* src)
{
	bool recording = false;
	char buffer[512], fw[512], full[512], res[1024], templated[1024];
	int i, len;
	cpystr(src, res);
	for(i = 0; i < (int)strlen(src); ++i) {
		char c = src[i];
		if(c == '}') {
			recording = false;
			/* capture full template */
			substr(src, full, i - strlen(buffer) - 1, strlen(buffer) + 2);
			if(full[1] == '^') {
				template_mods(full, templated);
			} else {
				template_link(full, templated);
			}
			swapstr(res, res, full, templated);
			/* save incoming */
			firstword(buffer, fw);
			if(!isurlstr(fw) && fw[0] != '^') {
				register_incoming(term, fw);
			}
		}
		if(recording) {
			len = strlen(buffer);
			buffer[len] = c;
			buffer[len + 1] = '\0';
		}
		if(c == '{') {
			recording = true;
			buffer[0] = '\0';
		}
	}
	cpystr(res, src);
}

bool
req_template(char* str)
int
link(Block* block, Glossary* glo, Lexicon* lex, Journal* jou)
{
	int i, open = 0, shut = 0;
	for(i = 0; i < (int)strlen(str); i++) {
		if(str[i] == '{') {
			open++;
		} else if(str[i] == '}') {
			shut++;
		}
	}
	if(open != shut) {
		printf("Warning: Templating mismatch: %s(%d/%d)\n", str, open, shut);
	int i, j;
	char buf[6];
	printf("Linking  | ");
	printf("glossary:%d ", glo->len);
	printf("lexicon:%d ", lex->len);
	for(i = 0; i < lex->len; ++i) {
		Term* t = &lex->terms[i];
		for(j = 0; j < t->body_len; ++j)
			fptemplate(NULL, glo, lex, t, t->body[j]);
		t->parent = findterm(lex, t->host);
		if(!t->parent)
			return error("Missing parent", t->host);
		if(!t->bref)
			return error("Missing bref", t->name);
		t->parent->children[t->parent->children_len++] = t;
	}
	return open > 0 && shut > 0;
}

void template(void)
{
	int i, j, count = 0;
	printf("Template | ");
	for(i = 0; i < all_terms.len; ++i) {
		Term* term = &all_terms.terms[i];
		for(j = 0; j < term->body_len; ++j) {
			if(req_template(term->body[j])) {
				template_seg(term, term->body[j]);
				count++;
			}
	printf("journal:%d ", jou->len);
	for(i = 0; i < jou->len; ++i) {
		Log* l = &jou->logs[i];
		l->term->logs_len++;
		l->term->ch += (l->code / 10) % 10;
		l->term->fh += l->code % 10;
		if(l->rune == '+') {
			l->term->events_len++;
			l->term->parent->events_len++;
		}
		if(!l->term->date_last)
			l->term->date_last = push(block, scpy(l->date, buf));
		if(l->code < 1)
			return error("Empty code", l->date);
		l->term->date_from = push(block, scpy(l->date, buf));
	}
	printf("%d strings", count);
	return 1;
}

void
build(void)
int
build(Glossary* glo, Lexicon* lex, Journal* jou)
{
	FILE* f;
	int i;
	printf("Building | ");
	printf("%d pages ", all_terms.len);
	for(i = 0; i < all_terms.len; ++i) {
		build_page(&all_terms.terms[i], &all_logs);
	printf("%d pages ", lex->len);
	for(i = 0; i < lex->len; ++i) {
		f = getfile("../site/", lex->terms[i].filename, ".html", "w");
		if(!f)
			return error("Could not open file", lex->terms[i].name);
		fphtml(f, glo, lex, &lex->terms[i], jou);
	}
	printf("1 feed ");
	build_rss(&all_logs);
	printf("2 feeds ");
	f = fopen("../links/rss.xml", "w");
	if(!f)
		return error("Could not open file", "rss.xml");
	fprss(f, jou);
	f = fopen("../links/tw.txt", "w");
	if(!f)
		return error("Could not open file", "tw.txt");
	fptwtxt(f, jou);
	return 1;
}

void
check(void)
check(Glossary* glo, Journal* jou)
{
	int pict_used_len;
	int pict_used[999];
	int i;
	pict_used_len = 0;
	int i, j, found = 0;
	printf("Checking | ");
	/* Find invalid logs */
	for(i = 0; i < all_logs.len; ++i) {
		Log* l = &all_logs.logs[i];
		if(l->code < 1) {
			printf("Warning: Empty code %s\n", l->date);
		}
		if(l->pict > 0) {
			pict_used[pict_used_len] = l->pict;
			pict_used_len++;
		}
	}
	/* Find unlinked lists */
	for(i = 0; i < all_lists.len; ++i) {
		List* l = &all_lists.lists[i];
		if(l->links_len < 1) {
			printf("Warning: Unlinked list \"%s\"\n", l->name);
		}
	for(i = 0; i < glo->len; ++i) {
		List* l = &glo->lists[i];
		if(l->routes < 1)
			printf("Warning: Unused list \"%s\"\n", l->name);
	}
	/* Find next available diary id */
	for(i = 1; i < 999; ++i) {
		int j;
		for(j = 0; j < pict_used_len; j++) {
			if(pict_used[j] == i && j < 0) {
				printf("Completed at #%d ", i);
				break;
			}
		found = 0;
		for(j = 0; j < jou->len; j++)
			if(jou->logs[j].pict == i || found)
				found = 1;
		if(!found) {
			printf("Available(#%d) ", i);
			break;
		}
	}
}


@@ 1186,26 1035,43 @@ check(void)
int
main(void)
{
	Block block;
	Glossary all_lists;
	Lexicon all_terms;
	Journal all_logs;
	clock_t start;
	int death = marble(1986, 3, 22);

	all_lists.len = 0;
	all_terms.len = 0;
	all_logs.len = 0;

	block.len = 0;
	block.data[0] = '\0';

	printf("Today    | ");
	print_arvelie();
	printf("    | Marble #%d(%.2f%%)\n", death, (death / (double)3900) * 100);

	start = clock();
	parse();
	printf("[%.2fms]\n", clock_since(start));
	start = clock();
	link();
	printf("[%.2fms]\n", clock_since(start));
	if(!parse(&block, &all_lists, &all_terms, &all_logs))
		return error("Failure", "Parsing");
	printf("[%.2fms]\n", clockoffset(start));

	start = clock();
	template();
	printf("[%.2fms]\n", clock_since(start));
	if(!link(&block, &all_lists, &all_terms, &all_logs))
		return error("Failure", "Linking");
	printf("[%.2fms]\n", clockoffset(start));

	start = clock();
	build();
	printf("[%.2fms]\n", clock_since(start));
	if(!build(&all_lists, &all_terms, &all_logs))
		return error("Failure", "Building");
	printf("[%.2fms]\n", clockoffset(start));

	start = clock();
	check();
	printf("[%.2fms]\n", clock_since(start));
	check(&all_lists, &all_logs);
	printf("[%.2fms]\n", clockoffset(start));

	printf("%d/%d characters in memory\n", block.len, STRMEM);

	return (0);
	return 0;
}

A src/mountaen.dSYM/Contents/Info.plist => src/mountaen.dSYM/Contents/Info.plist +20 -0
@@ 0,0 1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>CFBundleDevelopmentRegion</key>
		<string>English</string>
		<key>CFBundleIdentifier</key>
		<string>com.apple.xcode.dsym.mountaen</string>
		<key>CFBundleInfoDictionaryVersion</key>
		<string>6.0</string>
		<key>CFBundlePackageType</key>
		<string>dSYM</string>
		<key>CFBundleSignature</key>
		<string>????</string>
		<key>CFBundleShortVersionString</key>
		<string>1.0</string>
		<key>CFBundleVersion</key>
		<string>1</string>
	</dict>
</plist>

A src/mountaen.dSYM/Contents/Resources/DWARF/mountaen => src/mountaen.dSYM/Contents/Resources/DWARF/mountaen +0 -0
A src/oscean => src/oscean +0 -0
A src/oscean.dSYM/Contents/Info.plist => src/oscean.dSYM/Contents/Info.plist +20 -0
@@ 0,0 1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>CFBundleDevelopmentRegion</key>
		<string>English</string>
		<key>CFBundleIdentifier</key>
		<string>com.apple.xcode.dsym.oscean</string>
		<key>CFBundleInfoDictionaryVersion</key>
		<string>6.0</string>
		<key>CFBundlePackageType</key>
		<string>dSYM</string>
		<key>CFBundleSignature</key>
		<string>????</string>
		<key>CFBundleShortVersionString</key>
		<string>1.0</string>
		<key>CFBundleVersion</key>
		<string>1</string>
	</dict>
</plist>

A src/oscean.dSYM/Contents/Resources/DWARF/oscean => src/oscean.dSYM/Contents/Resources/DWARF/oscean +0 -0
A src/projects/arvelie/arvelie.dSYM/Contents/Info.plist => src/projects/arvelie/arvelie.dSYM/Contents/Info.plist +20 -0
@@ 0,0 1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>CFBundleDevelopmentRegion</key>
		<string>English</string>
		<key>CFBundleIdentifier</key>
		<string>com.apple.xcode.dsym.arvelie</string>
		<key>CFBundleInfoDictionaryVersion</key>
		<string>6.0</string>
		<key>CFBundlePackageType</key>
		<string>dSYM</string>
		<key>CFBundleSignature</key>
		<string>????</string>
		<key>CFBundleShortVersionString</key>
		<string>1.0</string>
		<key>CFBundleVersion</key>
		<string>1</string>
	</dict>
</plist>

A src/projects/arvelie/arvelie.dSYM/Contents/Resources/DWARF/arvelie => src/projects/arvelie/arvelie.dSYM/Contents/Resources/DWARF/arvelie +0 -0
R src/projects/arvelie/arvelie.c => src/projects/arvelie/arvelie.h +86 -89
@@ 1,6 1,53 @@
#include <math.h>
#include <string.h>
#include <time.h>
/* helpers */

int
ymd_to_doty(int y, int m, int d)
{
	int i = 0, daymon = 0, dayday = 0;
	int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	if((y % 4) || ((y % 100) && (y % 400))) {
		months[3] = months[3] + 1;
	}
	for(i = 0; i < m; i++) {
		daymon += months[i];
	}
	dayday = d;
	return (daymon + dayday) - 1;
}

int
time_to_doty(time_t* t)
{
	struct tm* local = localtime(t);
	int y = local->tm_year + 1900;
	int m = local->tm_mon + 1;
	int d = local->tm_mday;
	return ymd_to_doty(y, m, d);
}

int
doty_to_month(int doty)
{
	int month = 0;
	int months[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
	while(months[month] < doty) {
		month++;
	}
	return month - 1;
}

int
doty_to_day(int doty)
{
	int month = 0;
	int months[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
	while(months[month] < doty) {
		month++;
	}
	return doty - months[month - 1];
}

/* validators */

int
is_valid_arvelie(char* date)


@@ 8,7 55,7 @@ is_valid_arvelie(char* date)
	int y = ((date[0] - '0') * 10) + date[1] - '0';
	int m = date[2] - 'A';
	int d = ((date[3] - '0') * 10) + date[4] - '0';
	if(strlen(date) != 5) {
	if(slen(date) != 5) {
		return 0;
	}
	if(y < 0 || y > 99 || m < 0 || m > 26 || d < 0 || d > 14) {


@@ 24,7 71,7 @@ is_valid_ymdstr(char* date)
	        (date[2] - '0') * 10 + date[3] - '0';
	int m = (date[5] - '0') * 10 + date[6] - '0';
	int d = (date[8] - '0') * 10 + date[9] - '0';
	if(strlen(date) != 10) {
	if(slen(date) != 10) {
		return 0;
	}
	if(y < 0 || y > 9999 || m < 0 || m > 12 || d < 0 || d > 31) {


@@ 33,20 80,7 @@ is_valid_ymdstr(char* date)
	return 1;
}

int
ymd_to_doty(int y, int m, int d)
{
	int i = 0, daymon = 0, dayday = 0;
	int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	if((y % 4) || ((y % 100) && (y % 400))) {
		months[3] = months[3] + 1;
	}
	for(i = 0; i < m; i++) {
		daymon += months[i];
	}
	dayday = d;
	return (daymon + dayday) - 1;
}
/* converters */

int
arvelie_to_doty(char* date)


@@ 54,67 88,45 @@ arvelie_to_doty(char* date)
	int m = date[2] - 'A';
	int d = ((date[3] - '0') * 10) + date[4] - '0';
	int doty = (m * 14) + d;
	return doty == -307 ? 364 : doty;
	return doty == -307 ? 364 : doty == -306 ? 265
	                                         : doty;
}

int
arvelie_to_epoch(char* date)
time_t
arvelie_to_time(char* arvelie)
{
	int y = ((date[0] - '0') * 10) + date[1] - '0';
	return arvelie_to_doty(date) + (y * 365);
	int doty = arvelie_to_doty(arvelie);
	int year = (arvelie[0] - '0') * 10 + (arvelie[1] - '0');
	int month = doty_to_month(doty);
	int day = doty_to_day(doty);
	struct tm str_time;
	str_time.tm_year = (2000 + year) - 1900;
	str_time.tm_mon = month;
	str_time.tm_mday = day;
	str_time.tm_hour = 0;
	str_time.tm_min = 0;
	str_time.tm_sec = 0;
	str_time.tm_isdst = 0;
	return mktime(&str_time);
}

int
get_epoch(void)
arvelie_to_offset(char* arvelie)
{
	int y, m, d;
	time_t now;
	struct tm* local;
	time(&now);
	local = localtime(&now);
	y = local->tm_year + 1900;
	m = local->tm_mon + 1;
	d = local->tm_mday;
	return (y % 100) * 365 + ymd_to_doty(y, m, d);
	return (int)arvelie_to_time(arvelie) / 86400;
}

/* TODO: Cleanup */

int
extract_year(char* arvelie)
get_offset(void)
{
	int result = 0, i = 0;
	for(i = 0; i < 2; i++) {
		result = result * 10 + (arvelie[i] - '0');
	}
	return result;
	time_t now;
	time(&now);
	return (int)now / 86400;
}

int
doty_to_month(int doty)
{
	int month = 0;
	int months[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
	while(months[month] < doty) {
		month++;
	}
	return month - 1;
}
/* printers */

int
doty_to_day(int doty)
{
	int month = 0;
	int months[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
	while(months[month] < doty) {
		month++;
	}
	return doty - months[month - 1];
}

/* Prints */

void
print_ymdstr_from_doty(int y, int doty)
{
	int d, m = 0, months[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};


@@ 123,10 135,11 @@ print_ymdstr_from_doty(int y, int doty)
	}
	if(m < 1) {
		printf("Error: Unknown Month\n");
		exit(0);
		return 1;
	}
	d = doty - months[m - 1];
	printf("%04d-%02d-%02d\n", y, m, d);
	return 0;
}

void


@@ 137,7 150,7 @@ print_arvelie_from_doty(int y, int doty)
	                  "S", "T", "U", "V", "W", "X", "Y", "Z", "+"};
	int d = (doty % 14) + 1;
	char* m = months[doty / 14];
	printf("%d%s%02d\n", y % 100, m, d);
	printf("%d%s%02d", y % 100, m, d);
}

void


@@ 150,7 163,7 @@ print_arvelie_from_time(time_t t)
	print_arvelie_from_doty(y, ymd_to_doty(y, m, d));
}

void
int
print_arvelie_from_ymdstr(char* date)
{
	int y = (date[0] - '0') * 1000 + (date[1] - '0') * 100 +


@@ 159,38 172,22 @@ print_arvelie_from_ymdstr(char* date)
	int d = (date[8] - '0') * 10 + date[9] - '0';
	if(!is_valid_ymdstr(date)) {
		printf("Error: Invalid YYYY-MM-DD date\n");
		exit(0);
		return 1;
	}
	print_arvelie_from_doty(y, ymd_to_doty(y, m, d));
	return 0;
}

void
int
print_ymdstr_from_arvelie(char* date)
{
	int y = ((date[0] - '0') * 10 + date[1] - '0') + 2000;
	if(!is_valid_arvelie(date)) {
		printf("Error: Invalid arvelie date\n");
		exit(0);
		return 1;
	}
	print_ymdstr_from_doty(y, arvelie_to_doty(date));
}

time_t
arvelie_to_time(char* arvelie)
{
	int doty = arvelie_to_doty(arvelie);
	int year = extract_year(arvelie);
	int month = doty_to_month(doty);
	int day = doty_to_day(doty);
	struct tm str_time;
	str_time.tm_year = (2000 + year) - 1900;
	str_time.tm_mon = month;
	str_time.tm_mday = day;
	str_time.tm_hour = 0;
	str_time.tm_min = 0;
	str_time.tm_sec = 0;
	str_time.tm_isdst = 0;
	return mktime(&str_time);
	return 0;
}

void

M src/projects/arvelie/build.sh => src/projects/arvelie/build.sh +2 -3
@@ 1,11 1,10 @@
#!/bin/bash

clang-format -i arvelie.c
clang-format -i arvelie.h
clang-format -i main.c

# cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o arvelie
gcc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined main.c -o arvelie
# tcc -Wall main.c -o arvelie
clang -Wall main.c -o arvelie

echo "Valid:"
./arvelie

M src/projects/arvelie/main.c => src/projects/arvelie/main.c +14 -7
@@ 1,19 1,26 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "arvelie.c"
#include "../../helpers.h"
#include "arvelie.h"

int
error(char* msg, char* val)
{
	printf("Error: %s(%s)\n", msg, val);
	return 1;
}

int
main(int argc, char* argv[])
{
	if(argc > 1) {
		if(strlen(argv[1]) == 10) {
		if(slen(argv[1]) == 10)
			print_arvelie_from_ymdstr(argv[1]);
		} else if(strlen(argv[1]) == 5) {
		else if(slen(argv[1]) == 5)
			print_ymdstr_from_arvelie(argv[1]);
		} else {
			printf("Error: Misformatted Input\n");
			exit(0);
		else {
			return error("Misformatted Input", "");
		}
	} else {
		print_arvelie();