Update site.
This commit is contained in:
		
							parent
							
								
									86b86ccdc0
								
							
						
					
					
						commit
						327ac4250c
					
				| @ -3,6 +3,10 @@ server_name metanohi.name www.metanohi.name; | ||||
| root /var/www/metanohi.name/web-serve; | ||||
| index index.html; | ||||
| 
 | ||||
| location ~ \.html$ { | ||||
|     internal; | ||||
| } | ||||
| 
 | ||||
| location / { | ||||
|     # Old rewrites. | ||||
|     rewrite ^/projects/aeltei https://git.metanohi.name/aeltei.git/; | ||||
|  | ||||
| @ -32,7 +32,7 @@ template_base = read(template_base_file) | ||||
| 
 | ||||
| 
 | ||||
| def pandoc(filename): | ||||
|     proc = subprocess.run(['pandoc', filename], stdout=subprocess.PIPE) | ||||
|     proc = subprocess.run(['pandoc', '--smart', filename], stdout=subprocess.PIPE) | ||||
|     return proc.stdout.decode('utf-8').strip() | ||||
| 
 | ||||
| def extract_markdown_title(filename): | ||||
|  | ||||
| @ -1,25 +1,26 @@ | ||||
| #+title: Na | ||||
| #&summary | ||||
| A new spoken and written language not in development. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #&toc | ||||
| --- | ||||
| abstract: A new spoken and written language not in development. | ||||
| --- | ||||
| 
 | ||||
| * Na | ||||
| # Na | ||||
| 
 | ||||
| ** Introduction | ||||
| *2011.* | ||||
| 
 | ||||
| ## Introduction | ||||
| 
 | ||||
| Na is a probalistic language. The more details you use when explaining an | ||||
| event, the more probable it is that the recipient understands you. This is not | ||||
| very different from typical languages ("a blue building" is more precise than | ||||
| "a building"), but the new thing in Na is that this guesswork is everywhere. | ||||
| 
 | ||||
| ** Alphabet | ||||
| ## Alphabet | ||||
| 
 | ||||
| Optimally, Na should have its own alphabet. To aid in its spreading, a subset | ||||
| of the Latin alphabet has been chosen instead: | ||||
| 
 | ||||
| : . A E I O B D F G K L N S T V | ||||
| ``` | ||||
| . A E I O B D F G K L N S T V | ||||
| ``` | ||||
| 
 | ||||
| All of these letters are pronounced as "short sounds", i.e. "A" is not | ||||
| pronounced as "AAY", but just "AE". This is the same for all wovels. There are | ||||
| @ -39,19 +40,19 @@ syllables (an extreme case) there are 10,485,760,000,000,000 different | ||||
| any-number-of-syllables-less-or-equal-to-10 words. | ||||
| 
 | ||||
| 
 | ||||
| *** TODO IPA/SAMPA | ||||
| ### TODO IPA/SAMPA | ||||
| 
 | ||||
| The author of this document is not very familiar with IPA, SAMPA, or any other | ||||
| phonetic alphabet. | ||||
| 
 | ||||
| ** Goals | ||||
| ## Goals | ||||
| 
 | ||||
| Na wants to be a useful language somewhat usable by people. Na has been | ||||
| designed to be fairly global, but since the creator of Na is fluent only in | ||||
| Germanic languages (Danish and English), and because the Latin alphabet is | ||||
| used, Na is non-global. Nevertheless, it /wants/ to be global. | ||||
| 
 | ||||
| ** Basics | ||||
| ## Basics | ||||
| 
 | ||||
| Na has no nouns, no verbs, no adjectives, no adverbiums, no pronouns, etc. In | ||||
| Na, the core of everything is a word more or less equivalent to the English | ||||
| @ -62,20 +63,20 @@ to subclassing classes). | ||||
| The groups at the first levels of heritance are: | ||||
| 
 | ||||
| + Existence :: BA | ||||
|   + Number :: BE | ||||
|     + Real number :: BEBA | ||||
|     + Integer :: BEBE | ||||
|     + Fraction :: BEBI | ||||
|     + Imaginary number :: BEBO | ||||
|     + Complex number :: BEDA | ||||
|   + Symbol :: BI | ||||
|     + Letter :: BIBA   | ||||
|   + Shape :: BO | ||||
|   + Relation :: DA | ||||
|   + Identity :: DE | ||||
|   + Absolute combiner :: DO | ||||
|   + Identifier :: FA | ||||
|   + Relative combiner :: FE | ||||
|     + Number :: BE | ||||
|         + Real number :: BEBA | ||||
|         + Integer :: BEBE | ||||
|         + Fraction :: BEBI | ||||
|         + Imaginary number :: BEBO | ||||
|         + Complex number :: BEDA | ||||
|     + Symbol :: BI | ||||
|         + Letter :: BIBA   | ||||
|     + Shape :: BO | ||||
|     + Relation :: DA | ||||
|     + Identity :: DE | ||||
|     + Absolute combiner :: DO | ||||
|     + Identifier :: FA | ||||
|     + Relative combiner :: FE | ||||
| 
 | ||||
| 
 | ||||
| TODO: Improve on groups. | ||||
| @ -127,12 +128,16 @@ generic table defined using the shape (*BO*) group. | ||||
| 
 | ||||
| A sentence where you combine words into a new word has this structure: | ||||
| 
 | ||||
| : <word 1> <word 2>[ <word 3>[...]] DO <new word>. | ||||
| ``` | ||||
| <word 1> <word 2>[ <word 3>[...]] DO <new word>. | ||||
| ``` | ||||
| 
 | ||||
| This is an absolute combination. It is also possible to make relative | ||||
| combinations where word mixes are not saved in new words: | ||||
| 
 | ||||
| : <word 1> <word 2>[...] FE <word(s)>[ ...]. | ||||
| ``` | ||||
| <word 1> <word 2>[...] FE <word(s)>[ ...]. | ||||
| ``` | ||||
| 
 | ||||
| In these relative cases, the words before an FE mark are evaluated when FE is | ||||
| reached. If FE is left out from such sentences, everything will be evaluated at | ||||
| @ -140,13 +145,15 @@ once. Programmers might find it helpful to think of FE as a stack resetter. | ||||
| 
 | ||||
| When you do not use the *DO* or *FE* combiner, you state something: | ||||
| 
 | ||||
| : <word 1>[ <word 2>[...]]. | ||||
| ``` | ||||
| <word 1>[ <word 2>[...]]. | ||||
| ``` | ||||
| 
 | ||||
| In real languages, this is the equivalent of actually expressing something --- | ||||
| combines do not express anything, they merely aid in preparing for later | ||||
| expressions. | ||||
| 
 | ||||
| ** Example 1: I see a table | ||||
| ## Example 1: I see a table | ||||
| 
 | ||||
| One can write "I see a table." in two ways: the absolute way with *DO* or the | ||||
| relative way with *FE*. | ||||
| @ -154,30 +161,43 @@ relative way with *FE*. | ||||
| Words for "I", "to see", and "table" have not yet been made, but we assume they | ||||
| are BIGUHA, NULASE, and GAVOTI, respectively. The integer 1 is FA BEBE B. | ||||
| 
 | ||||
| *** Absolute way | ||||
| ### Absolute way | ||||
| 
 | ||||
| + Step 1 :: Combine "I" and "to see" into a sentence using combinations from | ||||
|             different groups. Give it a name, e.g. VAVO. | ||||
| + Step 2 :: Combine the number 1 from the integer (*BEBE*) group with the table | ||||
|             from the shape group. Give it a name, e.g. GALO. | ||||
| + Step 3 :: a) Write VAVO GALO, or b) combine VAVO and GALO into e.g. VALO | ||||
|             (could be any word) and go to step four. | ||||
| + Step 4 :: Write VALO. | ||||
| Step 1 | ||||
|   ~ Combine "I" and "to see" into a sentence using combinations from | ||||
|     different groups. Give it a name, e.g. VAVO. | ||||
|    | ||||
| Step 2 | ||||
|   ~ Combine the number 1 from the integer (*BEBE*) group with the table | ||||
|     from the shape group. Give it a name, e.g. GALO. | ||||
| 
 | ||||
| Step 3 | ||||
|   ~ Either a) write VAVO GALO, or b) combine VAVO and GALO into e.g. VALO | ||||
|     (could be any word) and go to step four. | ||||
| 
 | ||||
| Step 4 | ||||
|   ~ Write VALO. | ||||
| 
 | ||||
| So: | ||||
| 
 | ||||
| : biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo do valo. valo. | ||||
| ``` | ||||
| biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo do valo. valo. | ||||
| ``` | ||||
| 
 | ||||
| or, shorter: | ||||
| 
 | ||||
| : biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo. | ||||
| ``` | ||||
| biguha nulase do vavo. gavoti fa bebe b do galo. vavo galo. | ||||
| ``` | ||||
| 
 | ||||
| The advantage of the first variation is that VALO can be reused again and again | ||||
| until people have forgotten what its temporary meaning is. For example, if you | ||||
| are telling a story where the main character often sees a table, you could do | ||||
| this: | ||||
| 
 | ||||
| : valo. valo. valo. valo. valo. | ||||
| ``` | ||||
| valo. valo. valo. valo. valo. | ||||
| ``` | ||||
| 
 | ||||
| It is not necessary to define new combinations all the time. Na comes with a | ||||
| small built-in set of combinations which is required learning for all Na | ||||
| @ -185,23 +205,27 @@ speakers. These built-in definitions should be used whenever possible, | ||||
| eventually in subclassed or changed forms, to make it easier to write --- and | ||||
| especially speak --- Na. | ||||
| 
 | ||||
| *** Relative way | ||||
| ### Relative way | ||||
| 
 | ||||
| The relative way is a bit simpler, shorter and easier to say: | ||||
| 
 | ||||
| : biguha nulase fa bebe b fe gavoti. | ||||
| ``` | ||||
| biguha nulase fa bebe b fe gavoti. | ||||
| ``` | ||||
| 
 | ||||
| In fact, this relative sentence can be made into an absolute sentence: | ||||
| 
 | ||||
| : biguha nulase fa bebe b fe gavoti do valo. valo. | ||||
| ``` | ||||
| biguha nulase fa bebe b fe gavoti do valo. valo. | ||||
| ``` | ||||
| 
 | ||||
| *** Notes | ||||
| ### Notes | ||||
| 
 | ||||
| In speech the relative way is much more useful than the absolute one. Both are | ||||
| useful, though. | ||||
| 
 | ||||
| 
 | ||||
| ** Identifiers | ||||
| ## Identifiers | ||||
| 
 | ||||
| Some of the groups can be used as identifiers. When an identifier is used one | ||||
| or more arguments are expected. The integer identifier requires one argument | ||||
| @ -209,7 +233,7 @@ or more arguments are expected. The integer identifier requires one argument | ||||
| after the point), and the letter identifier requires one argument. To use a | ||||
| group as an identifier, prefix it with *FA*. | ||||
| 
 | ||||
| ** Numbers | ||||
| ## Numbers | ||||
| 
 | ||||
| Numbers in Na are duodecimal, i.e. base 12. The alphabet is used as numbers. A | ||||
| is used for zero, the consonants range from 1 to 10, and O is used for 11. When | ||||
| @ -227,7 +251,7 @@ Examples: | ||||
| TODO: Improve this strange system | ||||
| 
 | ||||
| 
 | ||||
| ** Example 2: We transported the ship into another dimension | ||||
| ## Example 2: We transported the ship into another dimension | ||||
| 
 | ||||
| This sentence is a bit tricky. We start by splitting the sentence into | ||||
| meaningful parts: | ||||
| @ -244,7 +268,9 @@ LOLOTI, the past is BATATO, something specific is SESE, "ship" is MOLOTE, | ||||
| 
 | ||||
| It appears that it is actually quite easy to create a relative sentence now: | ||||
| 
 | ||||
| : batato gelo loloti fe sese molote niko fe fe tile kobo. | ||||
| ``` | ||||
| batato gelo loloti fe sese molote niko fe fe tile kobo. | ||||
| ``` | ||||
| 
 | ||||
| Notice the two FE in the end. Without the second FE, the sentence could also | ||||
| mean "We transported another dimension into the ship.". It would not be wrong | ||||
| @ -253,32 +279,36 @@ useful). | ||||
| 
 | ||||
| Remember that the following sentence means excactly the same as the previous: | ||||
| 
 | ||||
| : loloti batato gelo fe niko molote sese fe fe kobo tile. | ||||
| ``` | ||||
| loloti batato gelo fe niko molote sese fe fe kobo tile. | ||||
| ``` | ||||
| 
 | ||||
| Word order is only important in the case of identifiers and their arguments. | ||||
| 
 | ||||
| 
 | ||||
| ** Example 3: 33+2.4i | ||||
| ## Example 3: 33+2.4i | ||||
| 
 | ||||
| 33+2.4i is a complex number. The x+yi notation doesn't fit well in Na. Instead, | ||||
| the *FA BEDA* identifier is used (33+2.4i = 33.0+2.4i): | ||||
| 
 | ||||
| : fa beda td a d g. | ||||
| ``` | ||||
| fa beda td a d g. | ||||
| ``` | ||||
| 
 | ||||
| Again, this is not perfect. | ||||
| 
 | ||||
| 
 | ||||
| ** TODO Foreign words | ||||
| ## TODO Foreign words | ||||
| 
 | ||||
| Foreign words present a problem in Na. | ||||
| 
 | ||||
| 
 | ||||
| ** TODO Built-ins | ||||
| ## TODO Built-ins | ||||
| 
 | ||||
| ~1000 words needed to begin with. | ||||
| 
 | ||||
| 
 | ||||
| ** Miscellaneous | ||||
| ## Miscellaneous | ||||
| 
 | ||||
| Since there are only 16 characters (14 letters, the period, and space), one | ||||
| character can be stored in only 4 bits, and 2 characters can be stored in one | ||||
| @ -287,4 +317,3 @@ byte. | ||||
| Because of the infinitely many relatively different ways to say the same thing, | ||||
| texts and speech can be varied a great deal. This could be quite useful in | ||||
| e.g. poems. | ||||
| 
 | ||||
							
								
								
									
										49
									
								
								site/atem.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								site/atem.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | ||||
| --- | ||||
| abstract: A presentation of the new word 'atem' and why it's so desperately needed | ||||
| --- | ||||
| 
 | ||||
| # Atem: a new word | ||||
| 
 | ||||
| *2011.* | ||||
| 
 | ||||
| Have you ever checked the Wiktionary entry for 'meta'?  I have. It's | ||||
| right [here](http://en.wiktionary.org/wiki/meta#English).  When I looked | ||||
| at it, I noticed that there were no antonyms.  *None!* | ||||
| 
 | ||||
| But why? | ||||
| 
 | ||||
| I often find it useful to be able to un-metaize complex thoughts: | ||||
| instead of thinking about thinking (meta-thinking), I think.  Nothing | ||||
| else.  However, when I mention that "I think", it may not be obvious | ||||
| that before I was thinking, I was thinking about thinking, which is why | ||||
| I have chosen to create *atem*, a new word whose only function is to act | ||||
| as meta's antonym.  With this word, I can now say that "I atem-think", | ||||
| meaning "I think because I thought of thinking", or I can say that "I | ||||
| think", meaning "I think".  'atem' removes a lot of ambiguity from the | ||||
| English language. | ||||
| 
 | ||||
| Ok, maybe not that often, but sometimes it's useful. | ||||
| 
 | ||||
| Also, *atem* could be quite useful in abstract definitions, as a way to | ||||
| focus on making something abstract concrete instead of making something | ||||
| concrete abstract.  For example, this page is probably an atem-page, | ||||
| because somewhere out there there's a page about this page. | ||||
| 
 | ||||
| Perhaps every object in existence could be considered an atem object. | ||||
| It's not impossible, it just doesn't make much sense. | ||||
| 
 | ||||
| Still, this word could be useful.  I hope it gets into a dictionary. | ||||
| 
 | ||||
| 
 | ||||
| ## Update, February 11, 2012 (UTC) | ||||
| 
 | ||||
| I just found out that I'm not the only one who at some point found the | ||||
| lack of a meta antonym strange and annoying.  Naturally, I can't rely on | ||||
| Wiktionary to give me the latest opinions on language extensions. | ||||
| 
 | ||||
| A recent internet search for "meta antonym" gave me several links to | ||||
| pages where other people discussed the need.  Someone have even proposed | ||||
| the word "mesa". I don't care if the new antonym becomes "atem", "mesa" | ||||
| (which I guess has nothing to do with | ||||
| [this Mesa](https://en.wikipedia.org/wiki/Mesa_(computer_graphics))), | ||||
| or something else --- I just want it to exist. | ||||
| @ -1,50 +0,0 @@ | ||||
| #+title: Atem: a new word | ||||
| #&summary | ||||
| A presentation of the new word 'atem' and why it's so desperately needed | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+startup: showall | ||||
| 
 | ||||
| * Atem: a new word | ||||
| 
 | ||||
| Have you ever checked the Wiktionary entry for 'meta'? I have. It's right | ||||
| [[http://en.wiktionary.org/wiki/meta#English][here]]. When I looked at it, I noticed that there were no antonyms. *None!* | ||||
| 
 | ||||
| But why? | ||||
| 
 | ||||
| #+caption: This alien agrees. | ||||
| #&img;url=/img/aliens/lulala.png,float=right,width=200 | ||||
| I often find it useful to be able to un-metaize complex thoughts: instead of | ||||
| thinking about thinking (meta-thinking), I think. Nothing else. However, when I | ||||
| mention that "I think", it may not be obvious that before I was thinking, I was | ||||
| thinking about thinking, which is why I have chosen to create *atem*, a new | ||||
| word whose only function is to act as meta's antonym. With this word, I can now | ||||
| say that "I atem-think", meaning "I think because I thought of thinking", or I | ||||
| can say that "I think", meaning "I think". 'atem' removes a lot of ambiguity | ||||
| from the English language. | ||||
| 
 | ||||
| Ok, maybe not that often, but sometimes it's useful. | ||||
| 
 | ||||
| Also, *atem* could be quite useful in abstract definitions, as a way to focus | ||||
| on making something abstract concrete instead of making something concrete | ||||
| abstract. For example, this page is probably an atem-page, because somewhere | ||||
| out there there's a page about this page. | ||||
| 
 | ||||
| Perhaps every object in existence could be considered an atem object. It's not | ||||
| impossible, it just doesn't make much sense. | ||||
| 
 | ||||
| Still, this word could be useful. I hope it gets into a dictionary. | ||||
| 
 | ||||
| 
 | ||||
| * Update, February 11, 2012 (UTC) | ||||
| 
 | ||||
| I just found out that I'm not the only one who at some point found the lack of | ||||
| a meta antonym strange and annoying. Naturally, I can't rely on Wiktionary to | ||||
| give me the latest opinions on language extensions. | ||||
| 
 | ||||
| A recent internet search for "meta antonym" gave me several links to pages | ||||
| where other people discussed the need. Someone have even proposed the word | ||||
| "mesa". I don't care if the new antonym becomes "atem", "mesa" (which I guess | ||||
| has nothing to do with [[https://en.wikipedia.org/wiki/Mesa_(computer_graphics)][this Mesa]]), or something else --- I just want it to | ||||
| exist. | ||||
| 
 | ||||
| @ -1,32 +0,0 @@ | ||||
| #+title: CSS failings | ||||
| #&summary | ||||
| A travel through my past Cascading Style Sheets mistakes | ||||
| #& | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| * CSS failings | ||||
| 
 | ||||
| Once, I did not know about Cascading Style Sheets, or CSS. I knew HTML... What | ||||
| else would there be to know? | ||||
| 
 | ||||
| Oh, and I knew the =font= tag. It's safe to say my websites were not optimal. | ||||
| 
 | ||||
| 
 | ||||
| ** px in font-size | ||||
| 
 | ||||
| First, my apologies for not using the em&emph unit in font-size attributes. For | ||||
| years I have consistently used the px&emph unit when setting the sizes of | ||||
| fonts. I recently found out how wrong this is, how an incredibly arrogant | ||||
| offense to the universe it is, and I have begun correcting this mistake. | ||||
| 
 | ||||
| Why is it wrong, you ask? I once thought about that, because I had read | ||||
| somewhere that it was best to use em&emph. But I didn't fully understand the | ||||
| unit, and I certainly didn't want my precious design to be viewed differently | ||||
| by different users! I wanted to force every user to view the exact same render | ||||
| of my pages. This was not ill-meant; I think it originated because of general | ||||
| browser incompabilities and was then taken to an unfortunate extreme. | ||||
| 
 | ||||
| Essentially, it's wrong because it {forces the user to view the text in a | ||||
| specific size}&emph. | ||||
| 
 | ||||
| If I had read that earlier on, I wouldn't have made so many px-based CSS's. | ||||
| @ -1,23 +1,22 @@ | ||||
| #+title: Digital sikring mod gennemførsel af eksamen en realitet | ||||
| #&summary | ||||
| A text about the failings of digital education and "copy protection". In | ||||
| Danish. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+language: da | ||||
| --- | ||||
| abstract: | | ||||
|   A text about the failings of digital education and "copy protection".  In | ||||
|   Danish. | ||||
| --- | ||||
| 
 | ||||
| # Digital sikring mod gennemførsel af eksamen en realitet | ||||
| 
 | ||||
| Jeg sendte denne besked til Undervisningsministeriet som så fortalte mig at de | ||||
| skam nok var i gang med at gøre det nemmere for "Linus".. | ||||
| 
 | ||||
| Sendt 8. marts 2011. Se også <@eval macros.titlelink('stadig-digital-sikring')@>. | ||||
| 
 | ||||
| * Digital sikring mod gennemførsel af eksamen en realitet | ||||
| Sendt 8. marts 2011. Se også | ||||
| [Stadig digital sikring mod gennemførsel af eksamen](stadig-digital-sikring). | ||||
| 
 | ||||
| At gennemføre en skriftlig eksamen som elev på en gymnasial uddannelse er ikke | ||||
| nemt efter Undervisningsministeriet har indført låse uden nøgler på udleverede | ||||
| cd'er. Problemet bag er dog meget dybere: Digitaliseringen er fejlet. | ||||
| 
 | ||||
| Jeg går på htx (teknisk gymnasium) på 3. og sidste år[fn:nomore]. For ikke lang | ||||
| Jeg går på htx (teknisk gymnasium) på 3. og sidste år.[^nomore] For ikke lang | ||||
| tid siden var jeg til skriftlig terminsprøve i engelsk A hvor terminsprøven var | ||||
| en kopi af eksamen fra juni 2010. Som elev er man ofte lidt nervøs før man skal | ||||
| op til en eksamen. Har man forberedt sig godt nok? Har man glemt noget? Derfor | ||||
| @ -208,4 +207,4 @@ I april er der en digitaliseringskonference i Aarhus. Jeg håber der kommer | ||||
| noget godt ud af den. | ||||
| 
 | ||||
| 
 | ||||
| [fn:nomore] Det er jeg ikke længere. Jeg blev student i juni. | ||||
| [^nomore]: Det er jeg ikke længere. Jeg blev student i juni. | ||||
| @ -1,71 +0,0 @@ | ||||
| #+title: Digital freedom | ||||
| #&summary | ||||
| A discussion about digital freedom in general. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+startup: showall | ||||
| 
 | ||||
| #&+classes=warning | ||||
| This is a work in progress (more so than my other articles). | ||||
| #& | ||||
| 
 | ||||
| * Concepts | ||||
| 
 | ||||
| (Currently mostly about social networking.) | ||||
| 
 | ||||
| I like to follow this rule: When I create something substantial which I want to | ||||
| share, I host it myself. But why? Because I don't want to depend on something | ||||
| which I cannot control or strongly influence. | ||||
| 
 | ||||
| A decentralized social network must be widespread for people to be able to share | ||||
| private data with a select few, i.e. the select few must be used to using the | ||||
| decentralized network. | ||||
| 
 | ||||
| The difficulty of leaving a service is determined by the complexity of the | ||||
| social features of the service. | ||||
| 
 | ||||
| I only host my own works somewhere else than on my own host if I feel that I | ||||
| have a social obligation to do so, or if it's a link that points out of the | ||||
| service. I don't mind if what Facebook ends up being is the new digg. | ||||
| 
 | ||||
| The more difficult it is to leave a service, the more I feel I have a *social* | ||||
| obligation to host my works on the service. However, the more difficult it is to | ||||
| leave a service, the more I also feel that I have a *moral* obligation to /not/ | ||||
| host my works on the service. | ||||
| 
 | ||||
| I don't wish to host substantial works, even public ones, on e.g. Facebook. Not | ||||
| because Facebook gets to know them (I have made sure I don't mind them being | ||||
| public), but because I use a service which I don't like, and that may fuel the | ||||
| use in general, especially for my friends. As such, it doesn't matter what I | ||||
| publish on the service, it will no matter what (in varying degrees) accelerate | ||||
| the use of the service, which I do not want to happen. | ||||
| 
 | ||||
| In general, it's a balance. I try not to make others depend on Facebook because | ||||
| of me; I do that by not uploading large photo galleries to Facebook. However, | ||||
| photo galleries on Facebook have quite complex features. | ||||
| 
 | ||||
| 
 | ||||
| * Hardware freedom links (different views) | ||||
| 
 | ||||
| + [[https://www.fsf.org/resources/hw/endorsement/criteria]] | ||||
| + [[https://www.fsf.org/campaigns/free-bios.html]] | ||||
| + [[https://www.gnu.org/philosophy/android-and-users-freedom.html]] | ||||
| + [[http://projects.goldelico.com/p/gta04-main/page/FirmwareInjector/?rev=322]] | ||||
| + [[http://www.oreillynet.com/linux/blog/2007/08/the_four_freedoms_applied_to_h.html]] | ||||
| + [[http://www.boingboing.net/2010/09/19/intel-drm-a-crippled.html]] | ||||
| + [[http://lists.en.qi-hardware.com/pipermail/discussion/2010-January/001635.html]] | ||||
| + [[http://www.ofb.biz/safari/article/353.html]] | ||||
| + [[http://arstechnica.com/business/news/2006/12/8428.ars]] | ||||
| + [[http://distrowatch.com/weekly.php?issue=20100614#feature]] | ||||
| + [[http://libreplanet.org/wiki/When_should_firmware_be_free]] | ||||
| + [[http://www.datamation.com/osrc/article.php/3787736/Proprietary-Firmware-and-the-Pursuit-of-a-Free-Kernel.htm]] | ||||
| + [[https://lwn.net/Articles/352555/]] | ||||
| + [[https://lwn.net/Articles/460654/]] | ||||
| + [[http://lists.goldelico.com/pipermail/gta04-owner/2011-October/000375.html]] | ||||
| + [[http://lists.goldelico.com/pipermail/gta04-owner/2011-September/000325.html]] | ||||
| 
 | ||||
| I think hardware design freedom is as important as software freedom because of | ||||
| the same reasons I think free software is important.  The fact that modifying | ||||
| hardware is much more difficult than modifying software is irrelevant as the | ||||
| ability to do so it still useful, and as gaining the knowledge behind a design | ||||
| is also still useful. | ||||
| @ -1,9 +0,0 @@ | ||||
| #+title: Hacking | ||||
| #&summary | ||||
| Hackety hack. | ||||
| #& | ||||
| #+startup: showall | ||||
| 
 | ||||
| * Hacking | ||||
| 
 | ||||
| I use the term "hacking" to mean "playing with". | ||||
| @ -1,70 +0,0 @@ | ||||
| #+title: Licensing on metanohi | ||||
| #&summary | ||||
| What's up with all that stuff? | ||||
| #& | ||||
| #+startup: showall | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| * Licensing on metanohi | ||||
| 
 | ||||
| I usually just use the Do What The Fuck You Want To Public License, Version 2 | ||||
| from [[http://wtfpl.net/]]: | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
|         DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE  | ||||
|                     Version 2, December 2004  | ||||
| 
 | ||||
|  Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>  | ||||
| 
 | ||||
|  Everyone is permitted to copy and distribute verbatim or modified  | ||||
|  copies of this license document, and changing it is allowed as long  | ||||
|  as the name is changed.  | ||||
| 
 | ||||
|             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE  | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION  | ||||
| 
 | ||||
|   0. You just DO WHAT THE FUCK YOU WANT TO. | ||||
| #+END_SRC | ||||
| 
 | ||||
| I think the license is fun, and there really is no good reason to use anything | ||||
| else for most of my small, one-off projects.  For larger projects, I use BSD2 or | ||||
| BSD3 or whatever -- I accept all free software licenses and really do not wish | ||||
| to discuss them that much (although I admit that I have previously been more | ||||
| opionated). | ||||
| 
 | ||||
| 
 | ||||
| * Some reasons | ||||
| 
 | ||||
| I got tired of software and culture licenses.  I don't mind them, and I don't | ||||
| have anything against copyleft -- it's a tool, and it can be effective in some | ||||
| cases -- but for my own projects, I just want to publish something that people | ||||
| can use. | ||||
| 
 | ||||
| I still ask for attribution, but I do it in a nice way, and not with the | ||||
| implicit threat of a license.  If someone doesn't attribute me, it makes no | ||||
| difference to me whether they have to because of a license; I'm not going to do | ||||
| anything about it anyway. | ||||
| 
 | ||||
| I guess that some people consider e.g. CC BY-SA a recognizable symbol and that | ||||
| its law stuff is secondary.  I can follow that thought, but I just got tired of | ||||
| it. | ||||
| 
 | ||||
| Some people might not want to integrate WTFPL code into their project, but fuck | ||||
| them (okay, in practice I'll probably just relicense to BSD2 or BSD3 if | ||||
| necessary). | ||||
| 
 | ||||
| All that being said, I will work in any free software and free culture project | ||||
| no matter what license they use.  WTFPL is just for my own junk. | ||||
| 
 | ||||
| 
 | ||||
| * Copyright in general | ||||
| 
 | ||||
| I'm not a fan of copyright as it is right now, but I don't know if it should be | ||||
| removed alltogether (if that was even possible...).  I think it would be nice if | ||||
| copyright was only for commercial use. | ||||
| 
 | ||||
| 
 | ||||
| * Previously | ||||
| 
 | ||||
| I used to have a lot of text about this, but I've come to just not care.  It's | ||||
| all in the git history if you want to dig it up and read it. | ||||
| @ -1,15 +1,14 @@ | ||||
| #+title: Et langt digt (A Long Poem) | ||||
| #&summary | ||||
| Et langt digt jeg skrev for noget tid siden fordi jeg ikke kan lide digte. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+language: da | ||||
| ``` | ||||
| abstract: | | ||||
|   (A Long Poem.)  Et langt digt jeg skrev for noget tid siden fordi | ||||
|   jeg ikke kan lide digte. | ||||
| ``` | ||||
| 
 | ||||
| * Et langt digt | ||||
| # Et langt digt | ||||
| 
 | ||||
| #&img;url=frontpage.png,height=595,center,medlink=longpoem.pdf,alt=Forside | ||||
|  | ||||
| 
 | ||||
| Klik på billedet for at downloade digtet i PDF. | ||||
| [Download digtet i PDF.](longpoem.pdf) | ||||
| 
 | ||||
| Jeg har et lidt anstrengt forhold til digte. De virker så meningsløse, så | ||||
| ligegyldige, så dumme. Denne holdning er muligvis et resultat af alle de | ||||
| @ -28,30 +27,27 @@ selv om jeg ikke planlagde digtet til at give den effekt. | ||||
| Det eneste jeg rigtig har gjort noget ud af er coveret (som jeg er ret stolt | ||||
| af). | ||||
| 
 | ||||
| ** Uddrag | ||||
| ## Uddrag | ||||
| 
 | ||||
| #&pre | ||||
| Søren 1 -- ham med en gynge | ||||
| Hørte en dag en fremmed synge | ||||
| Det var hverken Sarræhh eller søsteren | ||||
| Så stemmen var fremmed | ||||
| Han kiggede til højre og venstre, til nord og syd | ||||
| Men hans sanser kunne ikke lokalisere den guddommelige lyd | ||||
| Til sidst gik han ud fra sin grund | ||||
| Hvorefter han faldt ned i et sund | ||||
| | Søren 1 -- ham med en gynge | ||||
| | Hørte en dag en fremmed synge | ||||
| | Det var hverken Sarræhh eller søsteren | ||||
| | Så stemmen var fremmed | ||||
| | Han kiggede til højre og venstre, til nord og syd | ||||
| | Men hans sanser kunne ikke lokalisere den guddommelige lyd | ||||
| | Til sidst gik han ud fra sin grund | ||||
| | Hvorefter han faldt ned i et sund | ||||
| 
 | ||||
| Når man ved siden af et sund bor | ||||
| Er det dumt at man tror der er jord | ||||
| Jorden er der se'fø'li, dog nok lidt sandet | ||||
| Men den er altså langt nede under vandet | ||||
| #& | ||||
| | Når man ved siden af et sund bor | ||||
| | Er det dumt at man tror der er jord | ||||
| | Jorden er der se'fø'li, dog nok lidt sandet | ||||
| | Men den er altså langt nede under vandet | ||||
| 
 | ||||
| 
 | ||||
| ** Ofte stillede spørgsmål | ||||
| ## Ofte stillede spørgsmål | ||||
| 
 | ||||
| [Ingen har faktisk stillet disse spørgsmål, men jeg kommer fremtiden i møde.] | ||||
| 
 | ||||
| *** Men digte er gode! Du har ikke ret når du påstår at digte er dårlige! | ||||
| ### Men digte er gode! Du har ikke ret når du påstår at digte er dårlige! | ||||
| 
 | ||||
| Ikke et spørgsmål. | ||||
| 
 | ||||
| @ -1,33 +1,35 @@ | ||||
| #+title: MagicNG | ||||
| #&summary | ||||
| The Next Generation Programming Language | ||||
| #& | ||||
| #+license: bysa | ||||
| #&toc | ||||
| --- | ||||
| abstract: The Next Generation Programming Language | ||||
| --- | ||||
| 
 | ||||
| * Chapter 1: The Future of Yesterday | ||||
| # MagicNG | ||||
| 
 | ||||
| /Software./ | ||||
| *From 2012.* | ||||
| 
 | ||||
| /Magic./ | ||||
| 
 | ||||
| # Chapter 1: The Future of Yesterday | ||||
| 
 | ||||
| *Software.* | ||||
| 
 | ||||
| *Magic.* | ||||
| 
 | ||||
| Two seemingly unrelated words. Yet together they form the essentials of the new | ||||
| programming language which has already changed how computers and humans interact | ||||
| with each other: *MagicNG* (short for Magic: The Next Generation). | ||||
| 
 | ||||
| *MagicNG* is not your common programming language; it is not biased towards one | ||||
| **MagicNG** is not your common programming language; it is not biased towards one | ||||
|  or two paradigms, in fact it uses none of the existing ways of programming: | ||||
| 
 | ||||
| + Functional programming is, naturally, much too functional for any magic-based | ||||
|   programming language, as magic is not /functional/, but | ||||
|   /magical/. Magic-based software does not require functionality as in something | ||||
|   being able to do something else, because it depends on magic which /does/ | ||||
|   stuff instead of making sure that /stuff/ can be done; this makes using a | ||||
|   programming language, as magic is not *functional*, but | ||||
|   *magical*. Magic-based software does not require functionality as in something | ||||
|   being able to do something else, because it depends on magic which *does* | ||||
|   stuff instead of making sure that *stuff* can be done; this makes using a | ||||
|   computer much faster. | ||||
| + Object-oriented programming does not fit very well with the ideas behind | ||||
|   *MagicNG* either. While the magic-oriented approach /is/ able to properly | ||||
|   **MagicNG** either. While the magic-oriented approach *is* able to properly | ||||
|   emulate object-oriented ways of doing things, such emulations will often | ||||
|   require {CMU&abbr='Central Magical Unit'}-expensive conversions from spell | ||||
|   require CMU-expensive ('Central Magical Unit') conversions from spell | ||||
|   scrolls to object-based representations. | ||||
| + Procedural programming conflicts with the nature of magic; since in the case | ||||
|   of magic, advanced heuristics are used run a program, the simple approach of | ||||
| @ -40,14 +42,14 @@ with each other: *MagicNG* (short for Magic: The Next Generation). | ||||
|   programming languages do, however, still base their entire existence on | ||||
|   deduction and knowledge, both of which are infinitely long below the | ||||
|   standards of magical programming languages. Deduction and knowledge are for | ||||
|   programming languages that do not /see/ how everything works, whose authors | ||||
|   programming languages that do not *see* how everything works, whose authors | ||||
|   do not understand the connectionabilities of everything. | ||||
| 
 | ||||
| In short, *MagicNG* employs the *magical programming* paradigm because it is | ||||
| In short, **MagicNG** employs the *magical programming* paradigm because it is | ||||
| superior to non-magical approaches. | ||||
| 
 | ||||
| 
 | ||||
| ** But how do I program in it? | ||||
| ## But how do I program in it? | ||||
| 
 | ||||
| The reader should now be comfortable thinking about programming in terms of | ||||
| magic and be able to see what a big mistake it was to learn all those outdated, | ||||
| @ -60,12 +62,12 @@ applications of magical programming, to pique the reader's curiosity. | ||||
| 
 | ||||
| 1. First, there is the temporal improvement. Since magic is independent of the | ||||
|    flow of time, a program can be run not just everywhere, but | ||||
|    every{/when/}. This is the sole reason MagicNG is already so popular --- | ||||
|    every*when*. This is the sole reason MagicNG is already so popular --- | ||||
|    someone spread its use many years ago, through several temporal-offset | ||||
|    MagicNG runs. | ||||
| 2. Speed. The Central Magical Unit runs programs magically many times faster | ||||
|    than any CPU in existence. This is possible due both to the previously | ||||
|    explained effects of magic in programming /and/ what we will come to refer | ||||
|    explained effects of magic in programming *and* what we will come to refer | ||||
|    as "magic downleveling" in later chapters (since magic cannot be optimized, | ||||
|    other approaches such as the downleveling approach have been developed). | ||||
| 3. Code maintenance also becomes much easier, as you will see in the examples | ||||
| @ -74,16 +76,16 @@ applications of magical programming, to pique the reader's curiosity. | ||||
| Now, to our first example. We wish to print to a computer console (on a magical | ||||
| computer) the magical string "Hello, world!". This is often accomplished in | ||||
| anything from 1 to 100 conventional lines in conventional programming | ||||
| languages; in MagicNG, it is not /that/ simple. It's another kind of simple, | ||||
| namely the /magic simple/ way, from now on referred to as the /magple/ way. | ||||
| languages; in MagicNG, it is not *that* simple. It's another kind of simple, | ||||
| namely the *magic simple* way, from now on referred to as the *magple* way. | ||||
| 
 | ||||
| To write the magple MagicNG code for this example, we first fire up our MagicNG | ||||
| interactive interpreter: | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| MagicNG vX | ||||
| ? | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| (MagicNG is not being developed because it relies on magic for updates, hence | ||||
| the 'X' version.) | ||||
| @ -95,19 +97,19 @@ computer and then print afterwards.) | ||||
| The =?= at the prompt means we can type something. Let us try typing the | ||||
| following: | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| ? one frog eye | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| What this tells the MagicNG interpreter is that if /it is not the case/ that no | ||||
| What this tells the MagicNG interpreter is that if *it is not the case* that no | ||||
| frog eyes exist in the programmer's vicinity, it will print "Hello, | ||||
| world!". The frog-eye detection is only a formality, included in MagicNG to | ||||
| make the proofs of magical truth be magically true, and so the sentence can be | ||||
| excluded if the programmer wishes so. That is, you could write | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| t | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| which is short for "one frog eye", and it would have the same effects. | ||||
| 
 | ||||
| @ -126,13 +128,13 @@ Now, it may not be obvious to the casual non-magician why and how both "one | ||||
| frog eye" and "t" eventually prints "Hello, world!". In fact, these two | ||||
| expressions are not at all the only ways to print "Hello, world!" --- one can | ||||
| also write "traveller with seven legs", "spider queen", or something | ||||
| similar. The thing to remember is that it is /the intention/ that counts. If | ||||
| you /feel/ that the expression "bonsai of Norway" prints the sum of all | ||||
| prime numbers below 4012, then /that is what it does/. | ||||
| similar. The thing to remember is that it is *the intention* that counts. If | ||||
| you *feel* that the expression "bonsai of Norway" prints the sum of all | ||||
| prime numbers below 4012, then *that is what it does*. | ||||
| 
 | ||||
| In essence, MagicNG is an *intention-based programming language*. This might at | ||||
| first sound like all other programming languages: You have an intention on | ||||
| which you base your programming. The difference here is that the intention /is/ | ||||
| which you base your programming. The difference here is that the intention *is* | ||||
| the programming and not just part of it. Once you have figured out what you | ||||
| want and written it down in your inner language, magic takes care of the boring | ||||
| stuff. | ||||
| @ -153,10 +155,10 @@ is compiled along with your program. With MagicIS, a compiled program that | ||||
| prints "My name is Niels" might look like this (imagine it compiled on a | ||||
| scroll): | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| Holy oak of honey | ||||
| ,si:pmnin34_=UUe | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| where the =,si:= part denotes the start of the serialized intention. | ||||
| 
 | ||||
| @ -165,7 +167,7 @@ command-line option. Note that it will need to be connected to your brain with | ||||
| a special magical interface to work. | ||||
| 
 | ||||
| 
 | ||||
| * Chapter 2: Real World Examples | ||||
| # Chapter 2: Real World Examples | ||||
| 
 | ||||
| "This is all very nice," you might think, "but what is it any good for?" | ||||
| 
 | ||||
| @ -173,51 +175,51 @@ MagicNG can be used for everything a typical, non-magical language can be used | ||||
| for, the major differences being that MagicNG is per definition faster, better | ||||
| and easier to program in. This has been magically proven. | ||||
| 
 | ||||
| ** cat | ||||
| ## cat | ||||
| 
 | ||||
| Consider the UNIX =cat= program. If written in C (even if you look at the Plan | ||||
| 9 version), there are many lines of source code. If written in Python 3, there | ||||
| are 2 lines: | ||||
| 
 | ||||
| #+BEGIN_SRC python3 | ||||
| ``` | ||||
| for line in open(filename): | ||||
|     print(line) | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| If written in MagicNG, there is _one_ line (/and/ it is magical): | ||||
| If written in MagicNG, there is _one_ line (*and* it is magical): | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| cauldron of candy | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| (without MagicIS enabled.) | ||||
| 
 | ||||
| 
 | ||||
| ** Finding a value when a key is known | ||||
| ## Finding a value when a key is known | ||||
| 
 | ||||
| In a non-magical programming language, you could use a hash map. Or you could | ||||
| sort the elements by their keys and use binary search. Or you could look | ||||
| through every element one by one. | ||||
| 
 | ||||
| In MagicNG, no such algorithms are used; /magic/ finds the value. In fact, this | ||||
| In MagicNG, no such algorithms are used; *magic* finds the value. In fact, this | ||||
| reveals a large, fascinating and unavoidable part of MagicNG: it does not | ||||
| support algorithms. | ||||
| 
 | ||||
| "No algorithms? But how, then, can I program?" you think. The answer is simple, | ||||
| and it has been explained before, but to stress it one last time: /magic/. | ||||
| and it has been explained before, but to stress it one last time: *magic*. | ||||
| 
 | ||||
| This leads us to another important part of MagicNG: its use of the *black box | ||||
| model*. The /black box model/ has been revered all over the known universe for | ||||
| model*. The *black box model* has been revered all over the known universe for | ||||
| its unchangeability (it is absolute), unworsenability (since you cannot change | ||||
| it, you cannot make it worse), high surprise factor ("who knew my program could | ||||
| do /that/?!"), and lack of meaningful error messages (no errors, no worries). | ||||
| do *that*?!"), and lack of meaningful error messages (no errors, no worries). | ||||
| 
 | ||||
| 
 | ||||
| ** Calculating the sum of a list of numbers | ||||
| ## Calculating the sum of a list of numbers | ||||
| 
 | ||||
| In C: | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ``` | ||||
| int sum(int xs[], int xs_len) { | ||||
|   int fin_sum = 0; | ||||
|   int i; | ||||
| @ -230,22 +232,22 @@ int sum(int xs[], int xs_len) { | ||||
| [...] | ||||
| 
 | ||||
| sum({1, 3, -2, 9}, 4); | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| In Python: | ||||
| 
 | ||||
| #+BEGIN_SRC python3 | ||||
| ``` | ||||
| sum([1, 3, -2, 9]) | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| In MagicNG: | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| head of Macbeth | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ** A flight simulator | ||||
| ## A flight simulator | ||||
| 
 | ||||
| Up until now, we have only looked at MagicNG programs spanning single | ||||
| lines. One can create a very powerful MagicNG program in one line, but | ||||
| @ -255,26 +257,26 @@ As a flight operator, you may wish to have a very durable and efficient 3D | ||||
| flight simulator; in MagicNG such a system can be written concisely in just | ||||
| three lines of magical code (four lines with MagicIS enabled). | ||||
| 
 | ||||
| #+BEGIN_SRC text | ||||
| ``` | ||||
| dragon claw polished with golden mead | ||||
|   mead in cauldron | ||||
| tastebuds of 23 pigs | ||||
| ,si:3=)uUUn!2aa | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| (Notice the indentation and the explicit number.) | ||||
| 
 | ||||
| 
 | ||||
| /[Chapters 3 through 88 have been excluded in this preview. Only members of | ||||
| the Magically Magical Magic Community (MMMC) have access to these chapters.]/ | ||||
| *[Chapters 3 through 88 have been excluded in this preview. Only members of | ||||
| the Magically Magical Magic Community (MMMC) have access to these chapters.]* | ||||
| 
 | ||||
| 
 | ||||
| * Chapter 89: How to Learn More | ||||
| # Chapter 89: How to Learn More | ||||
| 
 | ||||
| To recap: MagicNG is an easy language to learn, since not only does it not | ||||
| require the user to learn about algorithms, data structures and related wastes | ||||
| of time, but actually discourages that; MagicNG encourages its users to /not | ||||
| think/ which /reduces errors/. | ||||
| of time, but actually discourages that; MagicNG encourages its users to *not | ||||
| think* which *reduces errors*. | ||||
| 
 | ||||
| To expand your knowledge of MagicNG, both in theory and practice, do not look | ||||
| at the examples of other MagicNG programmers, unless you are *absolutely sure* | ||||
| @ -287,4 +289,3 @@ actually a very complex language). | ||||
| What you should do is lean back in a comfy chair and look into nothingness and | ||||
| not strain your mind. That way, everything you need to know will come to you | ||||
| eventually. That's how this book was written. | ||||
| 
 | ||||
							
								
								
									
										15
									
								
								site/myuniverse/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								site/myuniverse/index.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| --- | ||||
| abstract: I have attempted to define a universe. | ||||
| ---- | ||||
| 
 | ||||
| # My Universe | ||||
| 
 | ||||
| Everything is much too complex, so I have defined a simpler universe. | ||||
| 
 | ||||
| You can download v0.1 [here](myuniverse.pdf). | ||||
| 
 | ||||
| You can get the sources at | ||||
| 
 | ||||
| ``` | ||||
| $ git clone git://metanohi.name/myuniverse | ||||
| ``` | ||||
| @ -1,16 +0,0 @@ | ||||
| #+title: My Universe | ||||
| #&summary | ||||
| I have attempted to define a universe. | ||||
| #& | ||||
| #+startup: showall | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| * Introducing My Universe | ||||
| 
 | ||||
| Everything is much too complex, so I have defined a simpler universe. | ||||
| 
 | ||||
| You can download v0.1 [[myuniverse.pdf][here]]. | ||||
| 
 | ||||
| You can get the sources at | ||||
| 
 | ||||
| : $ git clone git://metanohi.name/myuniverse | ||||
							
								
								
									
										14
									
								
								site/nanonote/index.md
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								site/nanonote/index.md
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,14 @@ | ||||
| --- | ||||
| abstract: I have a NanoNote. | ||||
| --- | ||||
| 
 | ||||
| # My NanoNote | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| I own a [NanoNote](http://sharism.cc/). I think it's cool (though I | ||||
| haven't found much use for it yet). The default NanoNote distro comes | ||||
| with an [OpenWRT](http://openwrt.org/)-based. It's also possible to run | ||||
| Debian on it (with only 32 MiB RAM..), but it's slow. | ||||
| 
 | ||||
| (Originally, this page was meant to have a purpose.) | ||||
| @ -1,16 +0,0 @@ | ||||
| #+title: My NanoNote | ||||
| #&summary | ||||
| I have a NanoNote. | ||||
| #& | ||||
| #+license: bysa | ||||
| 
 | ||||
| * My NanoNote | ||||
| 
 | ||||
| #&img;url=glorious-nanonote.jpg, alt=Glorious NanoNote, center | ||||
| 
 | ||||
| I own a [[http://sharism.cc/][NanoNote]]. I think it's | ||||
| cool (though I haven't found much use for it yet). The default NanoNote | ||||
| distro comes with an [[http://openwrt.org/][OpenWRT]]-based. It's also possible to run Debian on it | ||||
| (with only 32 MiB RAM..), but it's slow. | ||||
| 
 | ||||
| (Originally, this page was meant to have a purpose.) | ||||
| @ -1,23 +0,0 @@ | ||||
| #+title: Number bases | ||||
| #&summary | ||||
| This is fairly serious. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| | Base                  | Description                                        | | ||||
| |-----------------------+----------------------------------------------------| | ||||
| | u-nary                | the always true base                               | | ||||
| | bi-nary               | the somewhat true base                             | | ||||
| | tri-nary              | hipster binary ("binary is so mainstream")         | | ||||
| | revolutio-nary        | trinary instead of binary                          | | ||||
| | counterrevolutio-nary | binary                                             | | ||||
| | imagi-nary            | unary imagined to be useful                        | | ||||
| | visio-nary            | binary or trinary, depending on the person         | | ||||
| | statio-nary           | trinary or binary, depending on the person         | | ||||
| | ordi-nary             | base 10 ("this works, so why use something else?") | | ||||
| | extraordi-nary        | base 11                                            | | ||||
| | veteri-nary           | base 14 ("Tetra? Is that an animal?")              | | ||||
| | no-nary               | unary                                              | | ||||
| | u-r-i-nary            | binary (mind melt)                                 | | ||||
| | evolutio-nary         | base 60                                            | | ||||
| | arbitr-ary            | whatever                                           | | ||||
| @ -1,14 +1,10 @@ | ||||
| #+title: Old junk code: Word finder | ||||
| #+summary: Less than perfect C code  | ||||
| #+license: wtfpl, unless otherwise noted | ||||
| #+startup: showall | ||||
| #&toc | ||||
| --- | ||||
| abstract: Less than perfect C code  | ||||
| --- | ||||
| 
 | ||||
| # Old junk code: Word finder | ||||
| 
 | ||||
| * Old junk code: Word finder | ||||
| 
 | ||||
| #+caption: Based on [[https://commons.wikimedia.org/wiki/File:2001-91-1_Computer,_Laptop,_Pentagon_(5891422370).jpg][this]], CC BY 2.0 | ||||
| #&img;url=sadcomputer.png, float=right | ||||
| .jpg), CC BY 2.0](sadcomputer.png) | ||||
| 
 | ||||
| If you ever get tired of looking at your own junk code, take a look at this. | ||||
| 
 | ||||
| @ -39,46 +35,46 @@ store the list of words on the stack instead of in memory, so words with length | ||||
| In any case, a word length of 10 would require about 100 MB, a word length of 11 | ||||
| about 1.2 GB, a word length of 12 about 15.6 GB, and a word length of 17 (like | ||||
| "inconspicuousness") about 16,5 Petabytes (16500000 GB). That's 6,5 Petabytes | ||||
| *more* than [[http://archive.org/web/petabox.php][what the Internet Archive uses]] to store millions of websites, books, | ||||
| video and audio. | ||||
| *more* than [what the Internet Archive uses](http://archive.org/web/petabox.php) | ||||
| to store millions of websites, books, video and audio. | ||||
| 
 | ||||
| So perhaps neither my algorithm nor my implementation was that good. | ||||
| 
 | ||||
| 
 | ||||
| * The code | ||||
| ## The code | ||||
| 
 | ||||
| Note that this code doesn't actually compile, because of all the wrong | ||||
| code. However, it did compile back in 2008 which means that either I added the | ||||
| wrong code after I had compiled it, or I used an overfriendly compiler (I don't | ||||
| remember which compiler it was, but it ran on Windows). I have run the old | ||||
| executable with ~wine~, and that works. | ||||
| executable with `wine`, and that works. | ||||
| 
 | ||||
| It's not necesarry to know C to laugh at this code, but it helps. | ||||
| 
 | ||||
| We'll start with some basic ~#include~s. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <math.h> | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| So far, so good. Then the global variables with descriptive names. And let's | ||||
| declare four strings of length 0 to be statically allocated, because we'll just | ||||
| extend them later on...? | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
| char os[0],s[0],r[0],t[0]; | ||||
| int l,c,rc,k,sk,i,ii,iii,ri; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| The next step is to define our own version of C's builtin ~strstr~ function | ||||
| The next step is to define our own version of C's builtin `strstr` function | ||||
| (almost). I was used to PHP, so I wanted the same return values as PHP's | ||||
| ~strpos~. | ||||
| `strpos`. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
| int strpos (const char *haystack, const char *needle) { | ||||
|   int i; | ||||
| 
 | ||||
| @ -92,14 +88,14 @@ int strpos (const char *haystack, const char *needle) { | ||||
| 
 | ||||
|   return -1; | ||||
| } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Then it's time for the main function. We don't want to separate it into | ||||
| auxiliary functions, because that's just ugly! | ||||
| 
 | ||||
| Indentation? Too much wastes too much space. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|  if (argc>1) { | ||||
| @ -114,7 +110,7 @@ int main(int argc, char *argv[]) | ||||
|  for(i=0;s[i];i++) { | ||||
|  s[i]=tolower(s[i]); | ||||
|  } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Wait, what? We use ~strcpy~ to copy the string ~argv[1]~, which contains the | ||||
| word we want to permute, into the statically allocated ~os~ with length 0? Or we | ||||
| @ -123,51 +119,51 @@ That's... not good. | ||||
| 
 | ||||
| At least these two lines aren't that bad. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  l=strlen(s); | ||||
|  c=pow(l,l); | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| But then begins the actual permutation generation logic. I have tried to | ||||
| re-understand it, with no success. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  rc=1; | ||||
|  i=0; | ||||
|  while (i<l-1) { | ||||
|  rc=rc*(l-i); | ||||
|  i++; | ||||
|  } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| While we're at it, why not declare two to-be-statically-allocated arrays with | ||||
| dynamically-generated ints as lengths? | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  int ca[l]; | ||||
|  char ra[rc][l+1]; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| And then some more assignments and ~while~ loops... | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  ri=0; | ||||
|  i=0; | ||||
|  while (i<c) { | ||||
|  k=1; | ||||
|  ii=0; | ||||
|  while (ii<l && k==1) { | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| This formula does something. I'm not sure what. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  ca[ii]=floor(i/pow(l,l-ii-1))-floor(i/pow(l,l-ii))*l; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| More ~while~ loops, now also with ~if~ statements. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  iii=0; | ||||
|  while (iii<ii) { | ||||
|  if (ca[ii]==ca[iii]) {k=0;} | ||||
| @ -180,27 +176,27 @@ More ~while~ loops, now also with ~if~ statements. | ||||
|  ii=0; | ||||
|  while (ii<l) { | ||||
|  strncpy(t,s+ca[ii],1); | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Let's concatenate ~t~ onto ~ra[ri]~, a string which hardly exists due to the | ||||
| ~char ra[rc][l+1];~ magic above. | ||||
| Let's concatenate `t` onto ~ra[ri]~, a string which hardly exists due to the | ||||
| `char ra[rc][l+1];` magic above. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  strcat(ra[ri],t); | ||||
|  ii++; | ||||
|  } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| And why not concatenate an end-of-string mark onto a string which, if it | ||||
| doesn't have an end-of-string mark, will make ~strcat~ fail miserably? | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  strcat(ra[ri],"\0"); | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| And then more junk. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  sk=1; | ||||
|  ii=0; | ||||
|  while (ii<ri && sk==1) { | ||||
| @ -215,51 +211,51 @@ And then more junk. | ||||
|  i++; | ||||
|  } | ||||
|  //printf("\nOrd: %s\nOrdl\x91ngde: %d\nOrdkombinationer: %d\n",os,l,ri); | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Phew... At this point, I'm certain that ~ra~ is supposed to be an array of all | ||||
| word permutations. So let's open our dictionary "ord.txt" and look for matches. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  FILE *f; | ||||
|  char wrd[128]; | ||||
|  if (f=fopen("ord.txt","r")) { | ||||
|  FILE *fw; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Everything is written both to output.txt *and* standard out. Anything else would | ||||
| be stupid. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  fw=fopen("output.txt","w"); | ||||
|  printf("Ord dannet af \"%s\":\n\n",os); | ||||
|  fprintf(fw,"Ord dannet af \"%s\":\n\n",os); | ||||
|  int wc=0; | ||||
|  while(!feof(f)) { | ||||
|  if(fgets(wrd,126,f)) { | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| The words each end with a newline, so let's replace the newline with an | ||||
| end-of-string mark. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  wrd[strlen(wrd)-1]=0; | ||||
|  //printf("%s\n",wrd); | ||||
|  k=0; | ||||
|  ii=0; | ||||
|  while (ii<ri && k==0) { | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| The magical core of the matching logic, using our own ~strpos~: | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  if (strpos(ra[ii],wrd)>-1) {k=1;} | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| If ~k == 1~, something good happens. But it doesn't happen at once for some | ||||
| reason. | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ```c | ||||
|  ii++; | ||||
|  } | ||||
|  if (k==1) { | ||||
| @ -277,17 +273,17 @@ reason. | ||||
|  } | ||||
|  return 0; | ||||
| } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| And that's my pretty C code. | ||||
| 
 | ||||
| 
 | ||||
| * The SML equivalent | ||||
| ## The SML equivalent | ||||
| 
 | ||||
| To make my inefficient algorithm a bit clearer, I have made a few SML functions | ||||
| to do the same as above: | ||||
| 
 | ||||
| #+BEGIN_SRC ocaml | ||||
| ```ocaml | ||||
| open List | ||||
| 
 | ||||
| (* Removes an element from a list. *) | ||||
| @ -334,11 +330,11 @@ fun findMatchingWords word wordList = | ||||
|                    exists (fn word => word = testWord) | ||||
|                           wordPermutations) wordList | ||||
|     end | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| As well as some SML functions to calculate the number of permutations and bytes: | ||||
| 
 | ||||
| #+BEGIN_SRC ocaml | ||||
| ```ocaml | ||||
| (* Calculates the factorial. *) | ||||
| fun factorial 0 = 1 | ||||
|   | factorial n = n * factorial (n - 1) | ||||
| @ -364,14 +360,12 @@ fun nPermutations len = foldl op+ 0 (map (fn n => factorial n * binomc len n) | ||||
| fun nSize len = 8 * len + foldl op+ 0 ( | ||||
|                 map (fn n => (n + 1) * factorial n * binomc len n) | ||||
|                     (upTo 1 len)) | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| * The alternative | ||||
| ## The alternative | ||||
| 
 | ||||
| Preprocess the dictionary into a clever data structure and don't use up all the | ||||
| memory. | ||||
| 
 | ||||
| 
 | ||||
| #&line | ||||
| 
 | ||||
| Originally published [[http://dikutal.dk/artikler/old-junk-code-word-finder][here]]. | ||||
| Originally published | ||||
| [here](http://dikutal.metanohi.name/artikler/old-junk-code-word-finder). | ||||
							
								
								
									
										34
									
								
								site/pandoc-highlighting.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								site/pandoc-highlighting.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode { | ||||
|   margin: 0; padding: 0; vertical-align: baseline; border: none; } | ||||
| table.sourceCode { width: 100%; line-height: 100%; } | ||||
| td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; } | ||||
| td.sourceCode { padding-left: 5px; } | ||||
| code > span.kw { color: #007020; font-weight: bold; } /* Keyword */ | ||||
| code > span.dt { color: #902000; } /* DataType */ | ||||
| code > span.dv { color: #40a070; } /* DecVal */ | ||||
| code > span.bn { color: #40a070; } /* BaseN */ | ||||
| code > span.fl { color: #40a070; } /* Float */ | ||||
| code > span.ch { color: #4070a0; } /* Char */ | ||||
| code > span.st { color: #4070a0; } /* String */ | ||||
| code > span.co { color: #60a0b0; font-style: italic; } /* Comment */ | ||||
| code > span.ot { color: #007020; } /* Other */ | ||||
| code > span.al { color: #ff0000; font-weight: bold; } /* Alert */ | ||||
| code > span.fu { color: #06287e; } /* Function */ | ||||
| code > span.er { color: #ff0000; font-weight: bold; } /* Error */ | ||||
| code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */ | ||||
| code > span.cn { color: #880000; } /* Constant */ | ||||
| code > span.sc { color: #4070a0; } /* SpecialChar */ | ||||
| code > span.vs { color: #4070a0; } /* VerbatimString */ | ||||
| code > span.ss { color: #bb6688; } /* SpecialString */ | ||||
| code > span.im { } /* Import */ | ||||
| code > span.va { color: #19177c; } /* Variable */ | ||||
| code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */ | ||||
| code > span.op { color: #666666; } /* Operator */ | ||||
| code > span.bu { } /* BuiltIn */ | ||||
| code > span.ex { } /* Extension */ | ||||
| code > span.pp { color: #bc7a00; } /* Preprocessor */ | ||||
| code > span.at { color: #7d9029; } /* Attribute */ | ||||
| code > span.do { color: #ba2121; font-style: italic; } /* Documentation */ | ||||
| code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */ | ||||
| code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */ | ||||
| code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */ | ||||
							
								
								
									
										13
									
								
								site/pvd/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								site/pvd/index.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| --- | ||||
| abstract: An old story | ||||
| --- | ||||
| 
 | ||||
| # Profeten, doktoren og videnskabsmanden | ||||
| 
 | ||||
| "Profeten, doktoren og videnskabsmanden" ("The Prophet, the Doctor and the | ||||
| Scientist") is a short nonsensical story in Danish by Niels. It is available | ||||
| under CC BY-SA 3.0+ as an A5-sized pdf. | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| [Download.](pvd.pdf) | ||||
| @ -1,13 +0,0 @@ | ||||
| #+title: Profeten, doktoren og videnskabsmanden | ||||
| #&summary | ||||
| A story | ||||
| #& | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| * Profeten, doktoren og videnskabsmanden | ||||
| 
 | ||||
| "Profeten, doktoren og videnskabsmanden" ("The Prophet, the Doctor and the | ||||
| Scientist") is a short nonsensical story in Danish by Niels. It is available | ||||
| under CC BY-SA 3.0+ as an A5-sized pdf. | ||||
| 
 | ||||
| <@html <a href='pvd.pdf'>Download.<br /><img src='p1.png' alt='Front page' /></a>@> | ||||
| @ -1,22 +1,20 @@ | ||||
| #+title: Combining PyGame and PyCairo | ||||
| #&summary | ||||
| How to combine two Pythonic graphical frameworks | ||||
| #& | ||||
| #+license: wtfpl | ||||
| --- | ||||
| abstract: How to combine two Pythonic graphical frameworks | ||||
| --- | ||||
| 
 | ||||
| * Combining PyGame and PyCairo | ||||
| # Combining PyGame and PyCairo | ||||
| 
 | ||||
| #&+classes=note | ||||
| See [[http://pygame.org/wiki/CairoPygame]] for other examples. | ||||
| #& | ||||
| **Note:** See | ||||
| [http://pygame.org/wiki/CairoPygame](http://pygame.org/wiki/CairoPygame) | ||||
| for other examples. | ||||
| 
 | ||||
| This piece of code allows you to convert a Cairo surface to a PyGame | ||||
| surface. It also includes a small example on how to make SVG loading work. It | ||||
| works with Python 2.5+ and requires relatively recent versions of pygame, | ||||
| pycairo and NumPy to work. For the SVG example to work, you must also have rsvg | ||||
| installed. | ||||
| surface. It also includes a small example on how to make SVG loading | ||||
| work. It works with Python 2.5+ and requires relatively recent versions | ||||
| of pygame, pycairo and NumPy to work. For the SVG example to work, you | ||||
| must also have rsvg installed. | ||||
| 
 | ||||
| #+BEGIN_SRC python2 | ||||
| ```python | ||||
| #!/usr/bin/env python | ||||
| # Copyleft 2010 Niels Serup, WTFPL 2.0. Free software. | ||||
| 
 | ||||
| @ -109,5 +107,4 @@ pygame.display.flip() | ||||
| clock = pygame.time.Clock() | ||||
| while not pygame.QUIT in [e.type for e in pygame.event.get()]: | ||||
|     clock.tick(30) | ||||
| #+END_SRC | ||||
| 
 | ||||
| ``` | ||||
| @ -1,31 +1,31 @@ | ||||
| #+title: Sound Programming | ||||
| #+summary: Programming sound in Live-Sequencer and ChucK | ||||
| #+license: wtfpl, unless otherwise noted | ||||
| #+startup: showall | ||||
| #&toc | ||||
| --- | ||||
| abstract: Programming sound in Live-Sequencer and ChucK | ||||
| --- | ||||
| 
 | ||||
| * Sound Programming | ||||
| Sound Programming | ||||
| ================= | ||||
| 
 | ||||
| Much can be programmed, and that includes sound. In the digital world, sound is | ||||
| typically represented by sequences of about 90 kB per second, so "printing" | ||||
| sound is merely a matter of printing bytes. As such, any general purpose | ||||
| language can be used to generate sounds. | ||||
| Much can be programmed, and that includes sound. In the digital world, | ||||
| sound is typically represented by sequences of about 90 kB per second, | ||||
| so "printing" sound is merely a matter of printing bytes. As such, any | ||||
| general purpose language can be used to generate sounds. | ||||
| 
 | ||||
| However, it's boring to create a program that does nothing but print bytes, and | ||||
| it's potentially difficult to make those bytes sound nice; we want abstractions | ||||
| to simplify matters for us: instruments, drums, musical notes, and a high-level | ||||
| program structure. Many programming languages have good libraries that allow us | ||||
| to achieve just that, but to keep it simple we'll focus on how to program sound | ||||
| in two languages designed to output sound: ChucK and Live-Sequencer. | ||||
| However, it's boring to create a program that does nothing but print | ||||
| bytes, and it's potentially difficult to make those bytes sound nice; we | ||||
| want abstractions to simplify matters for us: instruments, drums, | ||||
| musical notes, and a high-level program structure. Many programming | ||||
| languages have good libraries that allow us to achieve just that, but to | ||||
| keep it simple we'll focus on how to program sound in two languages | ||||
| designed to output sound: ChucK and Live-Sequencer. | ||||
| 
 | ||||
| Let's create some sounds. | ||||
| 
 | ||||
| 
 | ||||
| * The square wave | ||||
| The square wave | ||||
| =============== | ||||
| 
 | ||||
| We'll start with ChucK and a small square wave program: | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ``` {.c} | ||||
| // Connect a square oscillator to the sound card. | ||||
| SqrOsc s => dac; | ||||
| 
 | ||||
| @ -39,16 +39,17 @@ SqrOsc s => dac; | ||||
| while (true) { | ||||
|     1000::second => now; | ||||
| } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| ChucK is an imperative language. Instructions on how to install and run it can | ||||
| be found on its [[http://chuck.cs.princeton.edu/][website]], along with other useful information. You can listen to | ||||
| the above sound [[square.flac][here]]. | ||||
| ChucK is an imperative language. Instructions on how to install and run | ||||
| it can be found on its [website](http://chuck.cs.princeton.edu/), along | ||||
| with other useful information. You can listen to the above sound | ||||
| [here](square.flac). | ||||
| 
 | ||||
| To do the same in Live-Sequencer, we must find a square wave "instrument" and use | ||||
| that. | ||||
| To do the same in Live-Sequencer, we must find a square wave | ||||
| "instrument" and use that. | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| ``` {.haskell} | ||||
| module SquareWave where | ||||
| 
 | ||||
| -- Basic imports. | ||||
| @ -65,22 +66,24 @@ main = concat [ program lead1Square -- Use a square wave instrument. | ||||
|                 note 1000000 (a 4)  -- Play 1000000 milliseconds of the musical note A4 | ||||
|                 )                      -- about 440 Hz. | ||||
|               ];                    -- End with a semicolon. | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Live-Sequencer differs from ChucK in that it is functional, but another major | ||||
| difference is that while ChucK (in general) generates raw sound bytes, | ||||
| Live-Sequencer generates so-called MIDI codes, which another program converts to | ||||
| the actual audio. Live-Sequencer has a couple of funky features such as | ||||
| highlighting which part of one's program is played; read about it and how to | ||||
| install and run it at [[http://www.haskell.org/haskellwiki/Live-Sequencer][this wiki]]. You can listen to the above sound [[squarewave.flac][here]]. | ||||
| Live-Sequencer differs from ChucK in that it is functional, but another | ||||
| major difference is that while ChucK (in general) generates raw sound | ||||
| bytes, Live-Sequencer generates so-called MIDI codes, which another | ||||
| program converts to the actual audio. Live-Sequencer has a couple of | ||||
| funky features such as highlighting which part of one's program is | ||||
| played; read about it and how to install and run it at [this | ||||
| wiki](http://www.haskell.org/haskellwiki/Live-Sequencer). You can listen | ||||
| to the above sound [here](squarewave.flac). | ||||
| 
 | ||||
| Something more advanced | ||||
| ======================= | ||||
| 
 | ||||
| * Something more advanced | ||||
| Let's try to create a small piece of music which can be expressed easily | ||||
| in Live-Sequencer (listen [here](melodyexample.flac)): | ||||
| 
 | ||||
| Let's try to create a small piece of music which can be expressed easily in | ||||
| Live-Sequencer (listen [[melodyexample.flac][here]]): | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| ``` {.haskell} | ||||
| module MelodyExample where | ||||
| 
 | ||||
| import Prelude | ||||
| @ -137,19 +140,20 @@ mel2 x y n = concat [ twice (note qn (x 3)) | ||||
|                     , concatMap (note hn . y) [3, 4, 4] | ||||
|                     , note wn (x n) =:= note wn (y n) | ||||
|                     ]; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| When you play the program from the Live-Sequencer GUI, the code in use is | ||||
| highlighted: | ||||
| When you play the program from the Live-Sequencer GUI, the code in use | ||||
| is highlighted: | ||||
| 
 | ||||
| #&img;url=sound-highlight.png, width=640, center, caption=Highlighting of sound, screenshot  | ||||
| {width=700} | ||||
| 
 | ||||
| The same could be expressed in ChucK, but the comparison wouldn't be fair. While | ||||
| Live-Sequencer is designed for describing melodies, ChucK's purpose is sound | ||||
| synthesis, which is more general. We'll create something more fitting of ChucK's | ||||
| capabilities, while still focusing on the use of instruments (listen [[more_advanced.flac][here]]): | ||||
| The same could be expressed in ChucK, but the comparison wouldn't be | ||||
| fair. While Live-Sequencer is designed for describing melodies, ChucK's | ||||
| purpose is sound synthesis, which is more general. We'll create | ||||
| something more fitting of ChucK's capabilities, while still focusing on | ||||
| the use of instruments (listen [here](more_advanced.flac)): | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ``` {.c} | ||||
| // Background music for an old sci-fi horror B movie. | ||||
| 
 | ||||
| // Filters. | ||||
| @ -209,32 +213,33 @@ while (true) { | ||||
|     a_melody(mandolin, Math.random2(0, 350)); | ||||
|     a_melody(sitar, Math.random2(200, 360)); | ||||
| } | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| * Algorithmic composition | ||||
| Algorithmic composition | ||||
| ======================= | ||||
| 
 | ||||
| Why not have the computer generate the melody as well as the sound? That | ||||
| *sounds* like a great idea! | ||||
| **sounds** like a great idea! | ||||
| 
 | ||||
| Enter [[https: / / en.wikipedia.org / wiki / L-system][L-systems]]. An L-system has an alphabet and a set of rules, where each rule | ||||
| is used to transform the symbol on the left-hand side to the sequence of symbols | ||||
| on the right-hand side. We'll use this L-system to generate music: | ||||
| Enter [L-systems](https: / / en.wikipedia.org / wiki / L-system). An | ||||
| L-system has an alphabet and a set of rules, where each rule is used to | ||||
| transform the symbol on the left-hand side to the sequence of symbols on | ||||
| the right-hand side. We'll use this L-system to generate music: | ||||
| 
 | ||||
| #+BEGIN_SRC c | ||||
| ``` {.c} | ||||
| -- Based on https://en.wikipedia.org/wiki/L-system#Example_7:_Fractal_plant | ||||
| Alphabet: X, F, A, B, P, M | ||||
| Rules: | ||||
|   X -> FMAAXBPXBPFAPFXBMX | ||||
|   F -> FF | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| If we evaluate a L-system on a list, the system's rules are applied to each | ||||
| element in the list, and results are concatenated to make a new list. If we | ||||
| assign each symbol to a sequence of sounds and run the L-system a few times, we | ||||
| get [[lsystem.flac][this]]. | ||||
| If we evaluate a L-system on a list, the system's rules are applied to | ||||
| each element in the list, and results are concatenated to make a new | ||||
| list. If we assign each symbol to a sequence of sounds and run the | ||||
| L-system a few times, we get [this](lsystem.flac). | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| ``` {.haskell} | ||||
| module LSystem where | ||||
| 
 | ||||
| import Prelude | ||||
| @ -277,17 +282,19 @@ getLSystemSound expand interpret iterations start | ||||
| 
 | ||||
| -- Use the third iteration of the L-System, and start with just X. | ||||
| main = channelInsts ++ getLSystemSound expand interpret 3 [X]; | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| Using an L-system is one of many ways to take composition to a high | ||||
| level. L-systems can be used to generate fractals, which are nice. | ||||
| 
 | ||||
|      | ||||
| * And so on | ||||
| And so on | ||||
| ========= | ||||
| 
 | ||||
| Many abstractions in sound generation allow for fun sounds to happen. Interested | ||||
| people might want to also take a look at e.g.  [[http://haskell.cs.yale.edu/euterpea-2/][Euterpea]], [[http://puredata.info/][Pure Data]], or [[http://csounds.com/][Csound]]. | ||||
| Many abstractions in sound generation allow for fun sounds to happen. | ||||
| Interested people might want to also take a look at e.g. | ||||
| [Euterpea](http://haskell.cs.yale.edu/euterpea-2/), [Pure | ||||
| Data](http://puredata.info/), or [Csound](http://csounds.com/). | ||||
| 
 | ||||
| #&line | ||||
| 
 | ||||
| Originally published [[http://dikutal.dk/artikler/sound-programming][here]]. | ||||
| Originally published | ||||
| [here](http://dikutal.metanohi.name/artikler/sound-programming). | ||||
| @ -1,10 +1,8 @@ | ||||
| #+title: Stadig digital sikring mod gennemførsel af eksamen | ||||
| #&summary | ||||
| A text about the continuing failings of digital education and "copy | ||||
| protection". In Danish. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+language: da | ||||
| --- | ||||
| abstract: | | ||||
|   A text about the continuing failings of digital education and "copy | ||||
|   protection". In Danish. | ||||
| --- | ||||
| 
 | ||||
| Jeg sendte denne besked til Undervisningsministeriet som så forklarede at de | ||||
| var nødt til at bruge kopisikring fordi de brugte tekst, billeder og video fra | ||||
| @ -13,9 +11,10 @@ deres kraft af undervisningsministerium --- desuden er det ikke engang alle | ||||
| skoler der bruger de kopisikrede cd'er, så i flere tilfælde er kopisikring | ||||
| ligegyldig. Så fjern den dog! | ||||
| 
 | ||||
| Sendt 31. maj 2011. Se også <@eval macros.titlelink('digital-sikring')@>. | ||||
| Sendt 31. maj 2011. Se også | ||||
| [Digital sikring mod gennemførsel af eksamen en realitet](digital-sikring). | ||||
| 
 | ||||
| * Stadig digital sikring mod gennemførsel af eksamen | ||||
| # Stadig digital sikring mod gennemførsel af eksamen | ||||
| 
 | ||||
| Hej UVM | ||||
| 
 | ||||
| @ -104,12 +103,16 @@ ingen grund til at kryptere det. | ||||
| Dette er de rodmapper og -filer (efter media/) som jeg har adgang til på | ||||
| den krypterede cd: | ||||
| 
 | ||||
| : error.html files/ index.html loading.html xit!.html | ||||
| ``` | ||||
| error.html files/ index.html loading.html xit!.html | ||||
| ``` | ||||
| 
 | ||||
| Dette er de mapper og filer jeg har adgang til hvis jeg kunne dekryptere | ||||
| cd'en (data fra usb-stick): | ||||
| 
 | ||||
| : data/ files/ flashplayer/ images/ index.html js/ styles/ xit!.html | ||||
| ``` | ||||
| data/ files/ flashplayer/ images/ index.html js/ styles/ xit!.html | ||||
| ``` | ||||
| 
 | ||||
| Som eksempel på min filsystemssøgning kan vi tage filen 'index.html' som | ||||
| var i den ukrypterede del af cd'en, og filen 'data/uvmXml.xml' som jeg | ||||
| @ -117,27 +120,35 @@ ikke kunne læse fra cd'en. | ||||
| 
 | ||||
| Filen 'index.html' eksisterer: | ||||
| 
 | ||||
| : $ grep -i index.htm engeks11cd.iso | ||||
| : Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| $ grep -i index.htm engeks11cd.iso | ||||
| Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| 
 | ||||
| Og indholdet eksisterer også ('<body | ||||
| onload="UVM.view.funcFitToScreen()">' er unikt nok til kun at forekomme | ||||
| i 'index.html'): | ||||
| 
 | ||||
| : $ grep '<body onload="UVM.view.funcFitToScreen()">' engeks11cd.iso | ||||
| : Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| $ grep '<body onload="UVM.view.funcFitToScreen()">' engeks11cd.iso | ||||
| Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| 
 | ||||
| Vi ser at 'uvmXml.xml' faktisk også eksisterer: | ||||
| 
 | ||||
| : $ grep -i uvmXml.xml engeks11cd.iso | ||||
| : Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| $ grep -i uvmXml.xml engeks11cd.iso | ||||
| Binary file engeks11cd.iso matches | ||||
| ``` | ||||
| 
 | ||||
| Men hvad med dens indhold? Fra usb-sticken ved jeg at 'uvmXml.xml' har | ||||
| mange '<CONTENT>'-tags. Så: | ||||
| 
 | ||||
| : $ grep -i '<CONTENT>' engeks11cd.iso | ||||
| : $ echo $? | ||||
| : 1 | ||||
| ``` | ||||
| $ grep -i '<CONTENT>' engeks11cd.iso | ||||
| $ echo $? | ||||
| 1 | ||||
| ``` | ||||
| 
 | ||||
| Indholdet i 'uvmXml.xml' er altså ikke tilgængeligt uden dekryptering. | ||||
| 
 | ||||
| @ -157,16 +168,16 @@ Nå, bortset fra det var årets stilemne godt. | ||||
| 
 | ||||
| Relevante links: | ||||
| 
 | ||||
| + [[http://gnu.org/]] | ||||
| + [[http://fsf.org/]] | ||||
| + [[http://webmproject.org/]] | ||||
| + [[http://xiph.org/]] | ||||
| + [[http://theora.org/cortado/]] | ||||
| + [[http://w3.org/]] | ||||
| + [[http://w3.org/TR/html5/video.html]] | ||||
| + [http://gnu.org/](http://gnu.org/) | ||||
| + [http://fsf.org/](http://fsf.org/) | ||||
| + [http://webmproject.org/](http://webmproject.org/) | ||||
| + [http://xiph.org/](http://xiph.org/) | ||||
| + [http://theora.org/cortado/](http://theora.org/cortado/) | ||||
| + [http://w3.org/](http://w3.org/) | ||||
| + [http://w3.org/TR/html5/video.html](http://w3.org/TR/html5/video.html) | ||||
| 
 | ||||
| 
 | ||||
| V.h. Niels Serup 3. E, HTX Hillerød (snart student)[fn:done] | ||||
| V.h. Niels Serup 3. E, HTX Hillerød (snart student)[^done] | ||||
| 
 | ||||
| 
 | ||||
| [fn:done] Jeg blev student i juni. | ||||
| [^done]: Jeg blev student i juni. | ||||
| @ -7,7 +7,7 @@ body { | ||||
| } | ||||
| 
 | ||||
| #body { | ||||
|   width: 800px; | ||||
|   width: 850px; | ||||
|   margin: 0 auto; | ||||
| } | ||||
| 
 | ||||
| @ -17,7 +17,7 @@ body { | ||||
| } | ||||
| 
 | ||||
| #body header img { | ||||
|   width: 800px; | ||||
|   width: 850px; | ||||
|   height: 100px; | ||||
| } | ||||
| 
 | ||||
| @ -54,6 +54,14 @@ body { | ||||
|   color: #eeeeee; | ||||
| } | ||||
| 
 | ||||
| h1 { | ||||
|   margin-top: 1.5em; | ||||
| } | ||||
| 
 | ||||
| h1:first-child { | ||||
|   margin-top: 0; | ||||
| } | ||||
| 
 | ||||
| h2 { | ||||
|   margin-top: 1.2em; | ||||
| } | ||||
| @ -66,10 +74,30 @@ p { | ||||
|   margin-top: 0.8em; | ||||
| } | ||||
| 
 | ||||
| ul { | ||||
| .figure { | ||||
|   margin-top: 0.8em; | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .caption { | ||||
|   margin-top: 0; | ||||
|   font-size: 0.8em; | ||||
|   font-style: italic; | ||||
| } | ||||
| 
 | ||||
| ul, dl { | ||||
|   margin-top: 0.8em; | ||||
| } | ||||
| 
 | ||||
| dt { | ||||
|   font-style: italic; | ||||
| } | ||||
| 
 | ||||
| dd { | ||||
|   margin-left: 1.5em; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| pre { | ||||
|   margin-top: 0.8em; | ||||
|   border: 1px solid white; | ||||
| @ -79,6 +107,7 @@ pre { | ||||
| 
 | ||||
| code { | ||||
|   font-size: 16px; | ||||
|   white-space: pre; | ||||
| } | ||||
| 
 | ||||
| a:link, a:visited { | ||||
|  | ||||
							
								
								
									
										13
									
								
								site/tfr/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								site/tfr/index.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| --- | ||||
| abstract: An old story | ||||
| --- | ||||
| 
 | ||||
| # The Trasbexian Flow Regulator | ||||
| 
 | ||||
| "The Trasbexian Flow Regulator" is a short story by Niels. It is available under CC | ||||
| BY-SA 3.0+ as an A5-sized 12-paged pdf. | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| [Download.](pvd.pdf) | ||||
| 
 | ||||
| @ -1,12 +0,0 @@ | ||||
| #+title: The Trasbexian Flow Regulator | ||||
| #&summary | ||||
| A story | ||||
| #& | ||||
| #+license: wtfpl | ||||
| 
 | ||||
| * The Trasbexian Flow Regulator | ||||
| 
 | ||||
| "The Trasbexian Flow Regulator" is a short story by Niels. It is available under CC | ||||
| BY-SA 3.0+ as an A5-sized 12-paged pdf. | ||||
| 
 | ||||
| <@html <a href='tfr.pdf'>Download.<br /><img src='p1.png' alt='Front page' /></a>@> | ||||
| @ -1,13 +1,8 @@ | ||||
| #+title: Two spaces | ||||
| #&summary | ||||
| Not one. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+startup: showall | ||||
| #&toc | ||||
| --- | ||||
| abstract: Not one. | ||||
| --- | ||||
| 
 | ||||
| 
 | ||||
| * Two spaces | ||||
| # Two spaces | ||||
| 
 | ||||
| When I end a sentence and intend on writing a new, I type two spaces instead of | ||||
| one. | ||||
| @ -15,14 +10,18 @@ one. | ||||
| I do this only to separate sentence endings from period-terminated | ||||
| abbreviations.  Consider this sentence: | ||||
| 
 | ||||
| : I eat couches, e.g. brown ones. They are nice. | ||||
| ``` | ||||
| I eat couches, e.g. brown ones. They are nice. | ||||
| ``` | ||||
| 
 | ||||
| If you didn't know that "e.g." is an abbreviation, you might think that there | ||||
| are three sentences: "I eat couches, e.g.", "brown ones.", and "They are nice." | ||||
| 
 | ||||
| Now consider this sentence: | ||||
| 
 | ||||
| : I eat couches, e.g. brown ones.  They are nice. | ||||
| ``` | ||||
| I eat couches, e.g. brown ones.  They are nice. | ||||
| ``` | ||||
| 
 | ||||
| By typing two spaces between the sentences, I have made clear that there are | ||||
| only two sentences, and that the period in "e.g." is not the end of a sentence. | ||||
| @ -31,16 +30,16 @@ The problem is that the period has two purposes: To end a sentence and to end | ||||
| some abbreviations.  Always using two spaces to separate sentences solves this. | ||||
| 
 | ||||
| 
 | ||||
| * Other solutions | ||||
| # Other solutions | ||||
| 
 | ||||
| ** Revolution | ||||
| ## Revolution | ||||
| 
 | ||||
| The best solution would be to use a separate character for abbreviation | ||||
| termination, or none at all, so that the period is exclusively used for ending | ||||
| sentences. | ||||
| 
 | ||||
| 
 | ||||
| ** No change | ||||
| ## No change | ||||
| 
 | ||||
| One might think that another solution is to use just one space, the very thing | ||||
| that I'm arguing against.  In the example above with one space between | ||||
| @ -51,7 +50,9 @@ sentences: We know that a sentence must start with an uppercase letter, and | ||||
| However, uppercase letters *can* occur after abbreviations if they are part of | ||||
| given names.  Consider this sentence: | ||||
| 
 | ||||
| : I eat couches, e.g. Priscilla's brown one. They are nice. | ||||
| ``` | ||||
| I eat couches, e.g. Priscilla's brown one. They are nice. | ||||
| ``` | ||||
| 
 | ||||
| It's not clear that "Priscilla'" does not start a new sentence, because it's very | ||||
| similar to "They": Both words start with an uppercase letter and are placed | ||||
| @ -66,10 +67,12 @@ whether it's a sentence. | ||||
| But this is only true if the abbreviation can be used in only one way!  Read | ||||
| this sentence: | ||||
| 
 | ||||
| : I used to eat couches bef. I found the cow. | ||||
| `` | ||||
| I used to eat couches bef. I found the cow. | ||||
| ``` | ||||
| 
 | ||||
| It uses the abbreviation "bef." for "before"; see | ||||
| [[http://public.oed.com/how-to-use-the-oed/abbreviations/]]. | ||||
| [http://public.oed.com/how-to-use-the-oed/abbreviations/](http://public.oed.com/how-to-use-the-oed/abbreviations/). | ||||
| 
 | ||||
| The sentence can be read in two ways: Either you read it as one sentence -- "I | ||||
| used to eat couches before I found the cow" -- or you read it as two sentences | ||||
| @ -87,7 +90,7 @@ Also, we have assumed that all abbreviations are known, which excludes temporary | ||||
| easier to just use two spaces between your sentences! | ||||
| 
 | ||||
| 
 | ||||
| * Two spaces and fixed width output | ||||
| # Two spaces and fixed width output | ||||
| 
 | ||||
| Due to my background/foreground as a programmer, I have a tendency to limit | ||||
| myself to 80 characters per line, and write two newlines when I start a new | ||||
| @ -104,10 +107,10 @@ This is one sentence, as "bef." does not end the sentence.  If we assume that | ||||
| the line width is not 80 characters, but instead 16 characters, then the line | ||||
| should be wrapped like this: | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| ``` | ||||
| Bla bla bla bef. | ||||
| bla bla | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| But now it's not clear if "bef." ends a sentence or not!  If we want to turn the | ||||
| fixed-width representation back into a simple line representation, we don't know | ||||
| @ -117,15 +120,15 @@ The answer is that, when you line-wrap, you don't split word sequences separated | ||||
| by ". ", .i.e. you see an abbreviation and its following word as a single word. | ||||
| That way, you would end up with: | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| ``` | ||||
| Bla bla bla | ||||
| bef. bla bla | ||||
| #+END_SRC | ||||
| ``` | ||||
| 
 | ||||
| which would not cause any problems. | ||||
| 
 | ||||
| 
 | ||||
| * General thoughts | ||||
| # General thoughts | ||||
| 
 | ||||
| Most natural languages have some amount of unambiguity, and part of it seems to | ||||
| make some things easier, i.e. allowing speakers to be loose when talking about | ||||
| @ -1,12 +1,12 @@ | ||||
| #+title: Unnamed Good Story | ||||
| #&summary | ||||
| Wrote it because it was fun, stopped when it was not fun anymore. | ||||
| #& | ||||
| #+license: wtfpl | ||||
| --- | ||||
| abstract: Wrote it because it was fun, stopped when it was not fun anymore. | ||||
| --- | ||||
| 
 | ||||
| #&img;url=frontpage.png,center,medlink=unnamed-good-story.pdf,float=left,alt=Front page | ||||
|  | ||||
| 
 | ||||
| * Unnamed Good Story | ||||
| [Download.](unnamed-good-story.pdf) | ||||
| 
 | ||||
| # Unnamed Good Story | ||||
| 
 | ||||
| 1. Good (it's in the title) | ||||
| 2. 9 word-packed chapters full of words | ||||
| @ -21,8 +21,4 @@ Wrote it because it was fun, stopped when it was not fun anymore. | ||||
| 
 | ||||
| I think the first chapter is the best chapter. | ||||
| 
 | ||||
| Comments can be sent to my email address, found [[/about/niels][here]]. | ||||
| 
 | ||||
| #&clear | ||||
| Click on the picture to download the story in PDF. | ||||
| 
 | ||||
| Comments can be sent to my email address. | ||||
							
								
								
									
										241
									
								
								site/unhappy/index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								site/unhappy/index.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,241 @@ | ||||
| --- | ||||
| abstract: Rant about Haskell's parser "Happy". | ||||
| --- | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 
 | ||||
| Unhappy About Happy: A Reflection or Something Like That | ||||
| ======================================================== | ||||
| 
 | ||||
| For the purposes of my quiet rage, this document will be written in all | ||||
| caps. I also will not use proper language. I won't even give suggestions | ||||
| on how to improve Happy; I'll just complain. | ||||
| 
 | ||||
| STARTING NOW | ||||
| 
 | ||||
| WHAT HAPPY ??? | ||||
| -------------- | ||||
| 
 | ||||
| HAPPY IS PARSER GENERATOR. IT GENERATE HASKELL CODE. VISIT | ||||
| [<HTTP://WWW.HASKELL.ORG/HAPPY/>](http://www.haskell.org/happy/) FOR | ||||
| UGLY INFO. | ||||
| 
 | ||||
| HOW HAPPY GOOD | ||||
| -------------- | ||||
| 
 | ||||
| -   EFFICIENT I GUESS | ||||
| -   WORKS OK | ||||
| -   PRETTY LOGO | ||||
| 
 | ||||
| WHY I NOT LIKE HAPPY | ||||
| -------------------- | ||||
| 
 | ||||
| ### JUZT TYPICAL | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| ONE ERROR IN PARSER.Y GIVE HUGE TYPE ERROR | ||||
| 
 | ||||
| **WHAT IS THIS!** | ||||
| 
 | ||||
|     dist/build/l0c/l0c-tmp/Language/L0/Parser/Parser.hs:2452:42: | ||||
|         Couldn't match type `Value' with `BasicValue -> Value' | ||||
|         Expected type: HappyAbsSyn | ||||
|                          (Name, SrcLoc) | ||||
|                          [(Name, | ||||
|                            DeclTypeBase Name, | ||||
|                            [ParamBase Name], | ||||
|                            ExpBase NoInfo Name, | ||||
|                            SrcLoc)] | ||||
|                          (Name, | ||||
|                           DeclTypeBase Name, | ||||
|                           [ParamBase Name], | ||||
|                           ExpBase NoInfo Name, | ||||
|                           SrcLoc) | ||||
|                          Uniqueness | ||||
|                          ([Maybe (DimSize Name)], ElemTypeBase NoInfo Name) | ||||
|                          (ElemTypeBase NoInfo Name) | ||||
|                          [TypeBase NoInfo Name] | ||||
|                          [TypeBase NoInfo Name] | ||||
|                          [ParamBase Name] | ||||
|                          (Maybe (CertificatesBase NoInfo Name), [ExpBase NoInfo Name]) | ||||
|                          [ExpBase NoInfo Name] | ||||
|                          [ExpBase NoInfo Name] | ||||
|     /* ... 200-300 MORE LINES ... */ | ||||
|                             [TupIdentBase NoInfo Name] | ||||
|                             (TupIdentBase NoInfo Name) | ||||
|                             (LambdaBase NoInfo Name) | ||||
|                             (TupleLambdaBase NoInfo Name) | ||||
|                             (BasicValue -> Value) | ||||
|                             Int | ||||
|                             (BasicValue -> Value) | ||||
|                             (BasicValue -> Value) | ||||
|                             (BasicValue -> Value) | ||||
|                             (BasicValue -> Value) | ||||
|                             (BasicValue -> Value) | ||||
|                             Value | ||||
|                             (BasicValue -> Value) | ||||
|                             (BasicValue -> Value) | ||||
|                             [Value] | ||||
|                             [Value] | ||||
|         In the second argument of `happySpecReduce_3', namely | ||||
|           `happyReduction_191' | ||||
|         In the expression: happySpecReduce_3 38# happyReduction_191 | ||||
|         In an equation for `happyReduce_191': | ||||
|             happyReduce_191 = happySpecReduce_3 38# happyReduction_191 | ||||
| 
 | ||||
| **NOT NICE NOT NICE AT ALL** | ||||
| 
 | ||||
| ### MONADA CAN I HAZ | ||||
| 
 | ||||
| MAYHAPS U NEED TO PARSE DIFFERENT THAN NORMAL KAY. HOW U THINK. YES: | ||||
| MENTALINCRMENTAL PARSING IT IS | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| YOU GOT NEED TO PARSE IO GETLINE SOURCES YEAH | ||||
| 
 | ||||
| PARSE EXPRESSION "2 + 1 \*4" OVER MULTI LINES LIKE THIS HERE | ||||
| 
 | ||||
|     WELCOM TO DA FUNKY MULTILINE EXPRESSION PARSER; ENTER UR EXPRESSION | ||||
|     > 2 + | ||||
|     1 *4 | ||||
|     TY GOT IT!!  PARSED EXPRESSION IS "2 + 1 * 4" AND U NICE; RESULT IS 6 BTW | ||||
|     > | ||||
| 
 | ||||
| PARSER SHOULD KNOW "YEAH NOT DUHNE PARSIN YET" WHEN "2 +" READ, SHOULD | ||||
| TEHN READ NEW LINE AND PARSE MORE! | ||||
| 
 | ||||
| WE CAN PARSE FROM BEGINNING EVERY TIME SURE BUT INEFECICIENT!!! | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| BUT HOW WE SHOULD / COULD DO THAT SMARTLY I IMPLORE TO LIKE ASK U | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| YES WE USE CONTINUATION WHICH SMART. LOOK ATTOPARSEC USE CONTINUATION IN | ||||
| RETURN! | ||||
| [<HTTP://HACKAGE.HASKELL.ORG/PACKAGE/ATTOPARSEC-0.11.1.0/DOCS/DATA-ATTOPARSEC-TEXT.HTML#T:IRESULT>](http://hackage.haskell.org/package/attoparsec-0.11.1.0/docs/Data-Attoparsec-Text.html#t:IResult) | ||||
| 
 | ||||
| YEAH BUT NOT IN HAPPY............ | ||||
| 
 | ||||
| SO WE MAKE IT MANUAL. WE SPECIFY OWN LEXER AND IMPROVE MONAD. WHEN END | ||||
| OF LINE IS REACH, WE TELL PARSER (FROM INSIDE DA PRASER) DAT DERE IS NO | ||||
| MORE EVER; IF THAT FAILS WE CATCH ERROR (EITHER-LIKE MONAD) AND READ NEW | ||||
| LINE FOR REALS | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| CLEVER SOLUTION OF US! BUT IN PARSE EXPRESION EXAMPLE ABOV WE USE IO TO | ||||
| GETLINE | ||||
| 
 | ||||
| **WE NOT WANT IO IN ALL PARSING.... EVER EVER!!!!!!!!** | ||||
| 
 | ||||
| HOWTO ABSTRACT IO AWAY? WE WANT TYPE OF EXPORTED FUNCTIONS FROM PARSER | ||||
| TO NOT USE **IO** *AT ALL* | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| SO WE USE WHATEVER MONAD TO GETLINE RIGHT? | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| class GetLiner m where -- KAY SO m IS MONAD RIGHT | ||||
|   getSomeLine :: m String | ||||
| 
 | ||||
| instance GetLiner IO where | ||||
|   getSomeLine = getLine | ||||
| ``` | ||||
| 
 | ||||
| WAIT I DONT GET IT | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| CLASS GETLINER M WHERE -- KAY SO M IS MONAD RIGHT | ||||
|   GETSOMELINE :: M STRING | ||||
| 
 | ||||
| INSTANCE GETLINER IO WHERE | ||||
|   GETSOMELINE = GETLINE | ||||
| ``` | ||||
| 
 | ||||
| MUCH BETTR. COZ TEHN WE CAN USE | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| BUT YIAH WE COULD USE TYPE CONSTRAINTS! | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| LEXER :: GETLINER M => M SOMETHNIG | ||||
| LEXER = MEHMEHMEH | ||||
|   WOO <- GETSOMELINE | ||||
|   MEH MEH | ||||
| ``` | ||||
| 
 | ||||
| SURE COULD WORK WE NEED JUST TELL HAPPY BOUT IT. | ||||
| 
 | ||||
|     %MONAD { GETLINER M => SOMETHINNG M } | ||||
| 
 | ||||
| FAILS MISERBLY.................... :-( :( :( | ||||
| 
 | ||||
| WE ARE LEFT 4 PONDER HOW TO SOLVE! HOWTO ABSTRAKT OUT IO! HOW!! | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| SOOOO..... WE NEED KINDA CONTINUATIN COMPUTATON MONADY THINGY. I GOT | ||||
| FRIEND WHO COME WIT CODE, SAY IT GOOD CODE. I CHECK, HE RIGHT! IS HERE | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| DATA READLINEMONAD A = VALUE A | ||||
|                      | GETLINE (STRING -> READLINEMONAD A) | ||||
| 
 | ||||
| INSTANCE MONAD READLINEMONAD WHERE | ||||
|   RETURN = VALUE | ||||
|   VALUE X >>= F = F X | ||||
|   GETLINE G >>= F = GETLINE $ \S -> G S >>= F | ||||
| ``` | ||||
| 
 | ||||
| HA CLEVER!!! NOW WE NEED NO TYPE CONSTRAINTS BECAUSE NOW COMPUTATION IS | ||||
| MONAD ITSELF! HOW YOU ASK. | ||||
| 
 | ||||
| READLINEMONAD HAS NO IO OR ANY ELSE BUILTIN; IT GETS LINE BY CREATE | ||||
| FUNCTION WHICH TAKES LINE TO CONTINUU EXECUTION. AGAIN AND AGAIN! LINE | ||||
| CAN COME FROM ANYTHIN. | ||||
| 
 | ||||
| EXAMPLE FOR USING RESULT! | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| GETLINESFROMIO :: READLINEMONAD A -> IO A | ||||
| GETLINESFROMIO (VALUE X) = RETURN X | ||||
| GETLINESFROMIO (GETLINE F) = DO | ||||
|   S <- GETLINE | ||||
|   GETLINESFROMIO $ F S | ||||
| ``` | ||||
| 
 | ||||
| U SEE WAT GOIN ON DERE! IN OUR LEXER WE NAMELI USED | ||||
| 
 | ||||
| ``` {.haskell} | ||||
| GETLINE VALUE | ||||
| ``` | ||||
| 
 | ||||
| TO GET LINE (BECAUSE FITS WITH CLEVER MONAD!) | ||||
| 
 | ||||
| **NICE-O!** | ||||
| 
 | ||||
| CODE IN QUSTION | ||||
| --------------- | ||||
| 
 | ||||
| LOOKIE HER FOR FULL DETAILS (ALTHOU WITH NO FULL CAPS): | ||||
| [<HTTPS://RARRW.GITHUB.COM/HIPERFIT/L0LANGUAGE/MASTER/SRC/LANGUAGE/L0/PARSER/PARSER.Y>](https://raw.github.com/HIPERFIT/L0Language/master/src/Language/L0/Parser/Parser.y) | ||||
| 
 | ||||
| CONCLUSION | ||||
| ---------- | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| THIS IS ENTRELY OBJECTIVE. | ||||
| 
 | ||||
| THIS IS ENTIREY OBJECTIVE. | ||||
| 
 | ||||
| THIS IS ENTIRLY OBJECTIVE. | ||||
| @ -1,256 +0,0 @@ | ||||
| #+title: Unhappy About Happy: A Reflection or Something Like That | ||||
| #&summary | ||||
| Rant about Haskell's parser "Happy". | ||||
| #& | ||||
| #+license: wtfpl | ||||
| #+startup: showall | ||||
| #&toc | ||||
| 
 | ||||
| #&img;url=UNHAPPY.PNG,float=right | ||||
| 
 | ||||
| * Unhappy About Happy: A Reflection or Something Like That | ||||
| 
 | ||||
| For the purposes of my quiet rage, this document will be written in all caps. | ||||
| I also will not use proper language.  I won't even give suggestions on how to | ||||
| improve Happy; I'll just complain. | ||||
| 
 | ||||
| STARTING NOW | ||||
| 
 | ||||
| 
 | ||||
| ** WHAT HAPPY ??? | ||||
| 
 | ||||
| HAPPY IS PARSER GENERATOR.  IT GENERATE HASKELL CODE.  VISIT | ||||
| [[http://www.haskell.org/happy/][HTTP://WWW.HASKELL.ORG/HAPPY/]] FOR UGLY INFO. | ||||
| 
 | ||||
| 
 | ||||
| ** HOW HAPPY GOOD | ||||
| 
 | ||||
| + EFFICIENT I GUESS | ||||
| + WORKS OK | ||||
| + PRETTY LOGO | ||||
| 
 | ||||
| 
 | ||||
| ** WHY I NOT LIKE HAPPY | ||||
| 
 | ||||
| *** JUZT TYPICAL | ||||
| 
 | ||||
| #+caption: ONE REASON.  TRUST NOT BUSH WITH HAPPY | ||||
| #&img;url=MEME0.PNG,float=center | ||||
| 
 | ||||
| ONE ERROR IN PARSER.Y GIVE HUGE TYPE ERROR | ||||
| 
 | ||||
| *WHAT IS THIS!* | ||||
| 
 | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| dist/build/l0c/l0c-tmp/Language/L0/Parser/Parser.hs:2452:42: | ||||
|     Couldn't match type `Value' with `BasicValue -> Value' | ||||
|     Expected type: HappyAbsSyn | ||||
|                      (Name, SrcLoc) | ||||
|                      [(Name, | ||||
|                        DeclTypeBase Name, | ||||
|                        [ParamBase Name], | ||||
|                        ExpBase NoInfo Name, | ||||
|                        SrcLoc)] | ||||
|                      (Name, | ||||
|                       DeclTypeBase Name, | ||||
|                       [ParamBase Name], | ||||
|                       ExpBase NoInfo Name, | ||||
|                       SrcLoc) | ||||
|                      Uniqueness | ||||
|                      ([Maybe (DimSize Name)], ElemTypeBase NoInfo Name) | ||||
|                      (ElemTypeBase NoInfo Name) | ||||
|                      [TypeBase NoInfo Name] | ||||
|                      [TypeBase NoInfo Name] | ||||
|                      [ParamBase Name] | ||||
|                      (Maybe (CertificatesBase NoInfo Name), [ExpBase NoInfo Name]) | ||||
|                      [ExpBase NoInfo Name] | ||||
|                      [ExpBase NoInfo Name] | ||||
| /* ... 200-300 MORE LINES ... */ | ||||
|                         [TupIdentBase NoInfo Name] | ||||
|                         (TupIdentBase NoInfo Name) | ||||
|                         (LambdaBase NoInfo Name) | ||||
|                         (TupleLambdaBase NoInfo Name) | ||||
|                         (BasicValue -> Value) | ||||
|                         Int | ||||
|                         (BasicValue -> Value) | ||||
|                         (BasicValue -> Value) | ||||
|                         (BasicValue -> Value) | ||||
|                         (BasicValue -> Value) | ||||
|                         (BasicValue -> Value) | ||||
|                         Value | ||||
|                         (BasicValue -> Value) | ||||
|                         (BasicValue -> Value) | ||||
|                         [Value] | ||||
|                         [Value] | ||||
|     In the second argument of `happySpecReduce_3', namely | ||||
|       `happyReduction_191' | ||||
|     In the expression: happySpecReduce_3 38# happyReduction_191 | ||||
|     In an equation for `happyReduce_191': | ||||
|         happyReduce_191 = happySpecReduce_3 38# happyReduction_191 | ||||
| #+END_SRC | ||||
| 
 | ||||
| *NOT NICE NOT NICE AT ALL* | ||||
| 
 | ||||
| 
 | ||||
| *** MONADA CAN I HAZ | ||||
| 
 | ||||
| MAYHAPS U NEED TO PARSE DIFFERENT THAN NORMAL KAY.  HOW U THINK.  YES: | ||||
| MENTALINCRMENTAL PARSING IT IS | ||||
| 
 | ||||
| #+caption: TWO REASON (I UNGOOD TO MEMES) | ||||
| #&img;url=MEME1.PNG,float=center | ||||
| 
 | ||||
| YOU GOT NEED TO PARSE IO GETLINE SOURCES YEAH | ||||
| 
 | ||||
| PARSE EXPRESSION "2 + 1 *4" OVER MULTI LINES LIKE THIS HERE | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| WELCOM TO DA FUNKY MULTILINE EXPRESSION PARSER; ENTER UR EXPRESSION | ||||
| > 2 + | ||||
| 1 *4 | ||||
| TY GOT IT!!  PARSED EXPRESSION IS "2 + 1 * 4" AND U NICE; RESULT IS 6 BTW | ||||
| > | ||||
| #+END_SRC | ||||
| 
 | ||||
| PARSER SHOULD KNOW "YEAH NOT DUHNE PARSIN YET" WHEN "2 +" READ, SHOULD TEHN | ||||
| READ NEW LINE AND PARSE MORE! | ||||
| 
 | ||||
| WE CAN PARSE FROM BEGINNING EVERY TIME SURE BUT INEFECICIENT!!! | ||||
| 
 | ||||
| #+caption: WE NOT WANT TIS SAYS PICARD 8-) | ||||
| #&img;url=MEME2.PNG,float=center | ||||
| 
 | ||||
| BUT HOW WE SHOULD / COULD DO THAT SMARTLY I IMPLORE TO LIKE ASK U | ||||
| 
 | ||||
| #+caption: CLEVER GILES HAS OUR SOLUTION!!!!! | ||||
| #&img;url=MEME3.PNG,float=center | ||||
| 
 | ||||
| YES WE USE CONTINUATION WHICH SMART.  LOOK ATTOPARSEC USE CONTINUATION IN | ||||
| RETURN! | ||||
| [[http://hackage.haskell.org/package/attoparsec-0.11.1.0/docs/Data-Attoparsec-Text.html#t:IResult][HTTP://HACKAGE.HASKELL.ORG/PACKAGE/ATTOPARSEC-0.11.1.0/DOCS/DATA-ATTOPARSEC-TEXT.HTML#T:IRESULT]] | ||||
| 
 | ||||
| YEAH BUT NOT IN HAPPY............ | ||||
| 
 | ||||
| SO WE MAKE IT MANUAL.  WE SPECIFY OWN LEXER AND IMPROVE MONAD.  WHEN END OF | ||||
| LINE IS REACH, WE TELL PARSER (FROM INSIDE DA PRASER) DAT DERE IS NO MORE EVER; | ||||
| IF THAT FAILS WE CATCH ERROR (EITHER-LIKE MONAD) AND READ NEW LINE FOR REALS | ||||
| 
 | ||||
| #+caption: AS MANY LINES AS LE POSSIBLÉ | ||||
| #&img;url=MEME4.PNG,float=center | ||||
| 
 | ||||
| CLEVER SOLUTION OF US!  BUT IN PARSE EXPRESION EXAMPLE ABOV WE USE IO TO GETLINE | ||||
| 
 | ||||
| *WE NOT WANT IO IN ALL PARSING.... EVER EVER!!!!!!!!* | ||||
| 
 | ||||
| HOWTO ABSTRACT IO AWAY?  WE WANT TYPE OF EXPORTED FUNCTIONS FROM PARSER TO NOT | ||||
| USE _IO_ /AT ALL/ | ||||
| 
 | ||||
| #+caption: YAEH BABBY | ||||
| #&img;url=MEME5.PNG,float=center | ||||
| 
 | ||||
| SO WE USE WHATEVER MONAD TO GETLINE RIGHT? | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| class GetLiner m where -- KAY SO m IS MONAD RIGHT | ||||
|   getSomeLine :: m String | ||||
| 
 | ||||
| instance GetLiner IO where | ||||
|   getSomeLine = getLine | ||||
| #+END_SRC | ||||
| 
 | ||||
| WAIT I DONT GET IT | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| CLASS GETLINER M WHERE -- KAY SO M IS MONAD RIGHT | ||||
|   GETSOMELINE :: M STRING | ||||
| 
 | ||||
| INSTANCE GETLINER IO WHERE | ||||
|   GETSOMELINE = GETLINE | ||||
| #+END_SRC | ||||
| 
 | ||||
| MUCH BETTR.  COZ TEHN WE CAN USE | ||||
| 
 | ||||
| #+caption: ... THEN WAT.  Y U SO SLACK | ||||
| #&img;url=MEME6.PNG,float=center | ||||
| 
 | ||||
| BUT YIAH WE COULD USE TYPE CONSTRAINTS! | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| LEXER :: GETLINER M => M SOMETHNIG | ||||
| LEXER = MEHMEHMEH | ||||
|   WOO <- GETSOMELINE | ||||
|   MEH MEH | ||||
| #+END_SRC | ||||
| 
 | ||||
| SURE COULD WORK WE NEED JUST TELL HAPPY BOUT IT. | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| %MONAD { GETLINER M => SOMETHINNG M } | ||||
| #+END_SRC | ||||
| 
 | ||||
| FAILS MISERBLY.................... :-( :( :( | ||||
| 
 | ||||
| WE ARE LEFT 4 PONDER HOW TO SOLVE!  HOWTO ABSTRAKT OUT IO!  HOW!! | ||||
| 
 | ||||
| #+caption: TRANCEND CONVENTIONAL COMPUTATIN U CAPITALIS PIG | ||||
| #&img;url=MEME7.PNG,float=center | ||||
| 
 | ||||
| SOOOO..... WE NEED KINDA CONTINUATIN COMPUTATON MONADY THINGY.  I GOT FRIEND | ||||
| WHO COME WIT CODE, SAY IT GOOD CODE.  I CHECK, HE RIGHT!  IS HERE | ||||
| 
 | ||||
| #+BEGIN_SRC haskell | ||||
| DATA READLINEMONAD A = VALUE A | ||||
|                      | GETLINE (STRING -> READLINEMONAD A) | ||||
| 
 | ||||
| INSTANCE MONAD READLINEMONAD WHERE | ||||
|   RETURN = VALUE | ||||
|   VALUE X >>= F = F X | ||||
|   GETLINE G >>= F = GETLINE $ \S -> G S >>= F | ||||
| #+END_SRC | ||||
| 
 | ||||
| HA CLEVER!!!  NOW WE NEED NO TYPE CONSTRAINTS BECAUSE NOW COMPUTATION IS MONAD | ||||
| ITSELF!  HOW YOU ASK. | ||||
| 
 | ||||
| READLINEMONAD HAS NO IO OR ANY ELSE BUILTIN; IT GETS LINE BY CREATE FUNCTION | ||||
| WHICH TAKES LINE TO CONTINUU EXECUTION.  AGAIN AND AGAIN!  LINE CAN COME FROM | ||||
| ANYTHIN. | ||||
| 
 | ||||
| EXAMPLE FOR USING RESULT! | ||||
| #+BEGIN_SRC haskell | ||||
| GETLINESFROMIO :: READLINEMONAD A -> IO A | ||||
| GETLINESFROMIO (VALUE X) = RETURN X | ||||
| GETLINESFROMIO (GETLINE F) = DO | ||||
|   S <- GETLINE | ||||
|   GETLINESFROMIO $ F S | ||||
| #+END_SRC | ||||
| 
 | ||||
| U SEE WAT GOIN ON DERE!  IN OUR LEXER WE NAMELI USED | ||||
| #+BEGIN_SRC haskell | ||||
| GETLINE VALUE | ||||
| #+END_SRC | ||||
| 
 | ||||
| TO GET LINE (BECAUSE FITS WITH CLEVER MONAD!) | ||||
| 
 | ||||
| *NICE-O!* | ||||
| 
 | ||||
| 
 | ||||
| ** CODE IN QUSTION | ||||
| 
 | ||||
| LOOKIE HER FOR FULL DETAILS (ALTHOU WITH NO FULL CAPS): | ||||
| [[https://raw.github.com/HIPERFIT/L0Language/master/src/Language/L0/Parser/Parser.y][HTTPS://RARRW.GITHUB.COM/HIPERFIT/L0LANGUAGE/MASTER/SRC/LANGUAGE/L0/PARSER/PARSER.Y]] | ||||
| 
 | ||||
| 
 | ||||
| ** CONCLUSION | ||||
| 
 | ||||
| #+caption: TRU STORY | ||||
| #&img;url=MEME8.PNG,float=center | ||||
| 
 | ||||
| #+caption: NOT ME | ||||
| #&img;url=MEME9.PNG,float=center | ||||
| 
 | ||||
| THIS IS ENTRELY OBJECTIVE. | ||||
| 
 | ||||
| THIS IS ENTIREY OBJECTIVE. | ||||
| 
 | ||||
| THIS IS ENTIRLY OBJECTIVE. | ||||
| @ -4,6 +4,7 @@ | ||||
|     <meta charset="utf-8"> | ||||
|     <title>metanohi.name: {title}</title> | ||||
|     <link href="/style.css" type="text/css" rel="stylesheet"> | ||||
|     <link href="/pandoc-highlighting.css" type="text/css" rel="stylesheet"> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="body"> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user