#!/usr/bin/env -S sbcl --script ;; ---------------------------------------------------------------------------- ;; "THE COFFEE-WARE LICENSE" (Revision 43): ;; wrote this file. As long as you retain this notice you ;; can do whatever you want with this stuff. If we meet some day, and you think ;; this stuff is worth it, you can buy me a coffee in return. ;; ---------------------------------------------------------------------------- ;; An example is worth a thousand words: ;; '("index.html" . (html ;; (head ;; (meta ;; @ charset utf-8) ;; (title ;; "Single-expression programs are fun")) ;; (body ;; (p ;; "A paragraph") ;; (hr) ;; (a ;; @ href "https://my.fsf.org/join" ;; "Join the FSF")))) (require 'uiop) ((lambda (html &rest pages) (dolist (page pages) (let ((fname (car page)) (node (cdr page))) (with-open-file (out fname :direction :output :if-exists :supersede :if-does-not-exist :create) (format out "~a~%~a" (if html "" "") (labels ((translate-node (node) (if (atom node) node (let ((tag (car node)) (body (cdr node))) (if (and (not (null body)) (atom body)) body (if (null body) (format nil "<~a />" tag) (multiple-value-bind (attr body) ((lambda (body) (let ((attr '()) (cont '()) (i 0)) (loop while (< i (length body)) do (let ((current (nth i body))) (if (eq current '@) (progn (setq attr (cons `(,(nth (incf i) body) . ,(nth (incf i) body)) attr)) (incf i)) (progn (setq cont (cons current cont)) (incf i))))) (values attr (nreverse cont)))) body) (format nil "<~a~{ ~a~}>~%~{~a~}~%~%" tag (mapcar #'(lambda (p) (format nil "~a=\"~a\"" (car p) (cdr p))) attr) (mapcar #'(lambda (n) (translate-node n)) body) tag)))))))) (translate-node node))))))) t ; we want some html here `("index.html" . (html (head (script @ type "text/javascript" @ src "buttons.js") (meta @ charset "utf-8") (link @ rel "stylesheet" @ href "index.css") (title "~gustek")) (body (table (tr (td @ style "padding-right: 2em;" (center (p (b "Gustek")) (a @ href "mailto:gustek@riseup.net" "<gustek@riseup.net>") (br) (a @ href "http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xb25c4318" "PGP Key") (br) (a @ href "https://github.com/Gystek" "My code"))) (td (p "Welcome.") (p "This page shouldn't even exist. " "I initially intended to publish a GPLv3 translation on this site, but I thought it would be weird to only publish a single, un-introduced file.") (p "Anyway, I'm Gustek, a 1st year preparatory class student and I'm French (it explains my low-quality English, sorry for that). " "I mostly program in Rust, C and Common Lisp but I enjoy some more functional stuff as well.") (p "I enjoy learning about languages, I speak French, English, Spanish and Polish.") (p "I wrote this page using a single " ,(multiple-value-bind (out err ret) (with-input-from-string (s (uiop:run-program (format nil "du -h ~a" *load-truename*) :output :string)) (uiop:run-program "awk -F' ' '{ print $1 }'" :input s :output '(:string :stripped t))) (format nil "~aiB" out)) " Lisp expression because it's fun, I guess. You can find it " (a @ href "homepage.lisp" "here") " if you want (it's Beerware so feel free to do whatever you want with it). " "It was written for SBCL though thus you might need to modify it a bit, at least the shebang, to be able to run it with your implementation." (br) "Please note that this site imports a font from the Google API to render Arabic text. If you don't want to have anything to do with " "them, feel free to block Google and download the Mirza font family in order to render this page properly.")))) (hr) ; (h3 "The Base Language Acquisition grammar and vocabulary list — 14.I.2024") ; (p "This page presents a plan for basic grammar and vocabulary acquisition in any language, thus granting the user a sufficient basis for conversation and further vocabulary and grammar acquisition.") ; (ol ; (li "Learn the pronounciation and writing system of the language; do not use romanisations: they won't be available when you actually have to use the language.") ; (li "Learn the grammatical basics of the language: noun formation, gender, declension, number, classes; adjectives, comparatives, superlatives; verbs, basic tenses, the copula, participles, aspect and mood, etc.; conjunctions, adverbs, pronouns and common derivational affixes; word order, syntax, subclauses, etc.") ; (li "Learn basic phrases and greetings, formal and informal; how to say your name; where you are from; etc.") ; (li "The next most important language element to learn is numbers: learn cardinals and ordinals from one to a milion, learn collective numbers, the verb for “to count” and for basic mathematical operations; number prefixes (“bi-”), number nouns (“a pair”); how to say ages (“to be born”), dates, name of days, months, how to read years, the time, century, phone numbers, how to express “point”, etc.") ; (li "Learn basic mathematical vocabulary, how to say verb, sentence, phrase, noun, etc.") ; (li "Learn the following vocabulary words:")) ; (ol ; (li (b "Essential verbs:") "to keep; to happen; to form; to create; to transform; to take; to carry; to bring; to transport; to move; to catch; to release; to put; to send; to take (something somewhere); to exchange; to switch; to give; to give back; to borrow; to lend; to rent; to sell; to buy; to throw; to throw (away); to start; to begin; to stop; to finish; to continue; to have; to walk; to run; to owe; to have to/must; to say; to speak; to talk; to write; to read; to hear; to listen; to see; to watch; to know (something); to know (someone); to increase; to decrease; to suppose; to contain; to own; to possess; to obtain; to fill; to empty; to use; to show; to point; to choose; to want; to prefer; to decide; to gift; to do; to understand; to be able to; to can; to be enough; to intervene; to think; to think (hold an opinion); to believe; to consider; to replace; to insist; to draw; to fight; to defend; to enter; to exit; to arrive; to reach; to depart; to go through; to go around; to flee; to connect; to link; to search; to find; to translate; to observe; to explain; to correct; to verify; to remember; to forget; to memorise; to check; to understand.") ; (li (b "Essential adjectives:") "big; small; tall; short; long; short; wide; narrow; big; small; slow; fast; hot; cold; new; old; good; bad; wet; dry; loud; quiet; beautiful; ugly; nice; rich; poor; thick; thin; expensive; cheap;") ; (li (b "The House") ; (ul ; (li (u "Nouns:") ; (em "— Rooms:") "kitchen; bedroom; hallway; restroom; bathroom; living room; dining room" ; (em "— Furniture:") "oven; stove; fridge; freezer; cupboard; drawer; microwave; table; chair; stool; bed; nightstand; wardrobe; lamp; carpet; toilet; sink; bathtub; shower; mirror; couch; armchair" ; (em "— Individual elements:") "knife; fork; spoon; plate; bowl; glass; napkin; tablecloth; cutlery; bottle; pitcher; sheet; pillow; mattress; nap; clock; lightbulb; soap; toothpaste; toothbrush; washing machine; laundry") ; (li (u "Verbs:") ; "to lay down; to sleep; to slumber; to wake up; to sit down; to sit; to shower; to wash; to dry; to switch on/off"))) ; (li (b "The Workplace/School")) ; (li (b "Outside")) ; (li (b "Food")) ; (li (b "The Family")) ; (li (b "Clothes and Body")) ; (li (b "Culture")) ; (li (b "Feelings and Thoughts")) ; (li (b "Government and Politics"))) ; (hr) (h3 "Languages I " (em "speak,") (u "learn") "and want to learn (in order) with resources — 04.I.2024") (ol @ class "languages" (li (em "French")) (li (em "English")) (li (em "Spanish")) (li (em "Polish")) (li (u "Russian")) (li "Chechen") (li "Classical Arabic") (li "Serbo-Croatian") (li (a @ href "https://www.jahanshiri.ir/fa/en" (u "Persian"))) (li "Italian") (li "Turkish") (li (details (summary "Avar") (ul (li (a @ href "https://avar.rocks/" "Avar Rocks")) (li (a @ href "http://avar.me/" "Русско-aварский словарь"))))) (li "German") (li (a @ href "http://hungarianreference.com" "Hungarian")) (li "Romanian") (li (a @ href "https://grammar.lingdocs.com/" "Pashto")) (li "Albanian") (li "Georgian") (li "Bulgarian") (li "Kabardian") (li "Hebrew") (li "Basque") (li "Mongolian") (li "Korean") (li "Kabyle")) (hr) (h3 "Kakoune syntax highlighting and indentation suck — 31.VII.2023") (p "Default indentation is super-rigid and it manages to get math mode wrong every single time when editing LaTeX.") (hr) (h3 "Why the Kazakh alphabets suck, and how to improve them — 23.VII.2023") (p "Kazakh language is mainly written in two alphabets: Cyrillic (majority) and Latin (official). They are both bad, but for different reasons.") (p "Let's start with the Cyrillic alphabet. It goes like this:") (p @ style "margin-left: 10em" (b "А /ɑ̝/ Ә /æ̝/") "Б /b/ Г /g/ Ғ /ʁ/ Д /d/" (b "Е /je̘/") "Ж /ʑ/ З /z/" (b "И /əj/") "Й /j/" (br) "К /k/ Қ /q/ Л /l/ М /m/ Н /n/ Ң /ŋ/" (b "О /o̞/ Ѳ /ɵ/") "П /p/ Р /ɾ/ С /s/" (br) "Т /t/" (b "У /ʊw/ /w/ Ұ /o̙/ Ү /ʉ/") "Х /χ/ Ш /ɕ/" (b "Ы /ə/ І /ɪ̞/ Э /e/")) (p "I removed the letters found only in loanwords because it's not important here. I put the vowels in bold typeface because they are the problem here.") (p "First of all, as we can see, the /w/ and /ʊw/ sounds are represented by the same letter. This is problematic, for obvious reasons. " "The improvement idea is, as the /v/ sound is only found in loanwords, to use the В letter to represent /w/, as it is done in Kalmyk and Mongolian.") (p "The next problem are the Ә and Ы letters. First, having a letter visually identical to the schwa, not represent the schwa /ə/ sound, is at best " "asinine. In other Turkic (and also in Mongolic) languages using the Cyrillic alphabet, ы usually represents /ɯ/, and it is illogical to have a yer " "⟨ы⟩, visually containing the letter ⟨i⟩, representing a sound far apart from the /i/-ish sounds. " "The improvement idea is to write the /æ/ sound Ӕ (as done in Ossetian), and the /ə/ sound Ә, as simple as that.") (p "Next is Ұ. Although it is not a major problem, it feels a bit un-natural to have a very у-looking sound representing not a /u/-ish nor /y/-ish letter. " "The improvement idea is, once again, as the /ju/ sound only exists in loanwords, to use the Ю letter to write the /o̙/ sound.") (p "Last but not least: И and І. It simply makes no sense to write /əj/ with a letter representing /i/ everywhere else. Thus, the improvement idea is to " "simply write it ӘЙ. Then І is not a problem in itself, as there is precedent (notably in Ruthenian) for writing the /ɪ̞/ sound like this, although it " "may be simpler to write it И.") (p "Now, the Latin alphabet (things get really worse).") (p @ style "margin-left: 10em" "A /ɑ̝/ Ä /æ/ B /b/ D /d/ E /e/ /je/ G /g/ Ğ /ʁ/ H /χ/ I /ɪ̞/ İ /j/ /əj/" (br) "J /ʑ/ K /k/ L /l/ M /m/ N /n/ Ñ /ŋ/ O /o/ Ö /ɵ/ P /p/ Q /q/" (br) "R /ɾ/ S /s/ Ş /ɕ/ T /t/ U /ʊw/ /w/ Ū /o̙/ Ü /ʉ/ Y /ə/ Z /z/") (p "The processus of latinization hoped to be completed by 2025 by the Kazakh government is but an attempt to break away and to destroy the memory" "of the Soviet period and of its historical ties to Russia, while showing a desperate desire to befriend the West. This is of the uttermost" "stupidity and ungratefulness. But we're not here to discuss politics, thus I'll simply show why their Latin alphabet is pure trash.") (p "First and maybe the biggest of problems, ⟨ñ⟩. It's also used by the ALA-LC (it's made by Americans, thus it's not a surprise to find " "such stupidities) and the Common Turkic Alphabet project, serving the same role as the latinization of Kazakh. Anyways, in its original language " "(Spanish) and in more than 16 languages, it represents /ɲ/. Its use for representing /ŋ/ simply makes no sense at all. Simple solution: just use " "the IPA symbol ⟨Ŋ⟩ or latinize the Cyrillic innovation (which is to me more visually pleasant) ⟨Ꞑ⟩.") (p "Now, Ū. It's obviously a simple latinization of the Cyrillic letter, and it doesn't make more sense that it does in Cyrillic. Thus, the solution would " "be more or less the same: in this case, simply use Ō, it's visually more straightforward.") (p "For U, the solution is identical: move the /w/ to W, and only keep one sound per letter.") (p "Then, İ, I and Y. The desire to resemble Turkish is obvious, and it shouldn't be blamed, Kazakh is a Turkic language after all. But representing both " "/əj/ and /j/ with the same letter is more than simian. Similarly, representing a neighbourg of /i/ with I instead of İ is actually the contrary of what " "is done in the Turkish language. My solution here is to represent /j/ with Y, /ə/ with I, /ɪ̞/ with İ and /əj/ with IY. As simple as that.") (p "Next is E. It has been taken as phonetically identical to the similarly looking Cyrillic letter, and the Э has been merged in it. Once again, it does " "nothing but confuse the language learner, thus it should simply represent /e/ with E, and /je̘/ with YE.") (p "Lastly, Ğ. Once again, its use arises from the desire of resembling Turkish. But it makes little sense here. Although it can be deduced just by " "looking at it if you know Kazakh phonology, it can be confusing and accidentaly read like in Turkish. The solution here would be to use either Ģ or Ġ, " "the latter already being used for representing a closely neighbouring sound in Arabic.") (p "To summarize, here are the two alphabets, with my modifications added:") (p @ style "margin-left: 10em" "А Ӕ Б В Г Ғ Д Е Ж З И Й К Қ Л М Н Ң О Ѳ П Р С Т У Ү Х Ш Ә ӘЙ Э Ю" (br) "A Ä B D E Ə G Ģ H I İ J K L M N Ꞑ O Ō Ö P Q R S Ş T U Ü W Y YƏ Z") ; (h3 "On the purification of Slavic languages from foreign influence — 27.VI.2023") ; (em "This note is available in" ; (a @ href "#" ; @ id "btn-purify-pl" ; "Polish") ; ", " ; (a @ href "#" ; @ id "btn-purify-cpl" ; "Cyrillic Polish") ; ", " ; (a @ href "#" ; @ id "btn-purify-ru" ; "Russian") ; ", " ; (a @ href "#" ; @ id "btn-purify-en" ; "English") ; " and " ; (a @ href "#" ; @ id "btn-purify-fr" ; "French")) ; (br) ; (br) ; (div @ id "purify-pl" "Nie jeszcze dostępny") ; (div @ id "purify-cpl" "Не еще достѧпный") ; (div @ id "purify-ru" "Нет ещё доступный") ; (div @ id "purify-en" "Not yet available") ; (div @ id "purify-fr" ; (h4 "De la purification des langues slaves de l'influence étrangère") ; (h5 "Plus facile à apprendre; idéologiquement isolé; phonoliquement et morphologiquement cohérent")) (hr) (h3 "About the Polish Cyrillic alphabet — 26.VI.2023") (p "The Cyrillic orthography I drafted for the Polish language this year is exceptionally bad, for various reasons:") (ol @ type "a" (li "Constructing ⟨ć⟩, ⟨l⟩, ⟨rz⟩, etc. through other means than soft consonants and the soft sign anihilates all etymology;") (li "The use of Serbian, Montenegrin and Tatar letters is simply not adapted for a Western Slavic language such as Polish;") (li "Accented letters do not exist as a single glyph in most if not all encodings;") (li "Some letters used here are actually opposite to what they represent (such as ⟨љ⟩ for ⟨ł⟩)")) (p "For these reasons, I came up with another proposal for a Cyrillic writing system for Polish, available" (a @ href "polish_cyrillic.pdf" "here")) (hr) (h3 "Why LATEX sucks — 26.V.2023") (p "It sucks mainly for two reasons: the first one is the extreme difficulty that comes with trying to use a different writing system than Latin or even some special diacritics, let alone actually" (i "mixing") "different writing systems. If anyone knows how to do this only loading packages (I can accept redefining one command or two, but not writing 20 lines of code for each writing system I wanna load), please send me an email, I really need this. The next problem, sadly the biggest one and the most impossible to fix, is error reporting. If you haven't seen the error fifty times yet, you will struggle to find out" (i "where") "it happened and" (i "why") "it happened. It's still the greatest typesetting tool for a lot of reasons though. Use LATEX.") (hr) (h3 "The Pillars of Lisp — " (span @ dir "rtl" "העמודים הלסוף‎")) (div @ style "max-width: 30em;" (blockquote @ class "meta" (blockquote @ dir "rtl" "תורה לסוף") (p @ style "margin-right: 2em; text-align: right;" (bdi "— סנהדרין 72a")) (blockquote @ dir "rtl" "כָּךְ הָיָה הַקָּדוֹשׁ בָּרוּךְ הוּא מַבִּיט בַּתּוֹרָה וּבוֹרֵא אֶת הָעוֹלָם, וְהַתּוֹרָה אָמְרָה בְּרֵאשִׁית בָּרָא אֱלֹהִים. וְאֵין רֵאשִׁית אֶלָּא תּוֹרָה, הֵיאַךְ מָה דְּאַתְּ אָמַר (משלי ח, כב): ה' קָנָנִי רֵאשִׁית דַּרְכּוֹ.") (p @ style "margin-right: 2em; text-align: right;" (bdi "— בּראשׁית רבּה, א:א")) (p @ style "text-align: right; margin-right: 2em;" (bdi "אז‎, ברא אלוהים את הע‎לם באמצעות Lisp."))) (p @ dir "rtl" @ style "font-family: serif; font-size: 1em; margin-right: 2em;" "—" (a @ href "https://judaism.stackexchange.com/questions/100650/ptij-where-do-we-learn-that-god-created-the-world-using-lisp" "source"))) (p "The Lisp programming language has 4 different pillars. Lacking even a single one of them disqualifies a language from being considered as a Lisp.") (ol (li (p (b (code "READ, EVAL, PRINT") "and " (code "LOOP.")) "Those do not need to form a " (em "REPL") "as we " "intend it nowadays. Rather, they must be present " "and available to the user for him to be able to write " "a complete" (em "REPL") "using a code of the following form: " (pre "(LOOP (PRINT (EVAL (READ))))") "The " (code "READ") "and" (code "PRINT") "functions must also " "satisfy the following equality:" (em "id = read ∘ print"))) (li (b "Homoiconicity,") " from Greek" (em "ομος") "and" (em "εικων,") " literally “same representation”. " "It means that source code written in the language can be manipulated in the language itself as primitive " "data. Even if not a pillar by itself, the idea of" (em "macros") "naturally arises from this concept, as " "homoiconicity enables powerful and complex macro-systems to function. What also arises from the concept " "of representation of the code as primitive data is direct self-evaluation, most notably in Lisp through " "the Meta-Circular Evaluator, using only seven primitive operators.") (li (b "No non-atom except cons cells.") "As many non-algebraic types, such as symbols, numbers, " "characters, Unicode characters, pointers, etc. as wanted may exist, but no algebraic type, " "meaning a type formed by combination of other types, is allowed to be primitively present " "in the language, except the linked list, or cons cell. Thus, Clojure is entirely excluded " "from the category of Lisps, given that its Java-based types contain a lot of those.") (li (b "MCE.") "The language must expose the necessary primitives to implement a Meta-Circular " "Evaluator using the least number of operators possible.")) (hr) (h3 @ id "semitic-orthographies-lojban" "Arabic and Hebrew Orthographies for Lojban") (table (tr (td @ style "width: 47vw; margin: 0 1.5vw 0 1.5vw;" (h4 "Arabic — rablermorna-pa — " (span @ dir "rtl" "رابلهرمۆرنا-پا")) (p "An Arabic orthography already exists for Lojban, called " (em "rablermorna,") "but I think " "it has multiple problems, making it difficult to use and largely suboptimal." (br) "I thus designed my own Arabic orthography for Lojban: " (em "rablermorna-pa.")) (table (tr (td (table @ class "has-rtl" (tr (th @ style "padding: 0 1em 0 1em;" "Latin letter") (th @ style "padding: 0 1em 0 1em;" (span @ dir "rtl" "رابلهرمۆرنا-پا"))) (tr (td "p") (td @ dir "rtl" "پ")) (tr (td "t") (td @ dir "rtl" "ت ط")) (tr (td "k") (td @ dir "rtl" "ک ق")) (tr (td "f") (td @ dir "rtl" "ف")) (tr (td "s") (td @ dir "rtl" "س ص")) (tr (td "c") (td @ dir "rtl" "ش")) (tr (td "b") (td @ dir "rtl" "ب")) (tr (td "d") (td @ dir "rtl" "د ض")) (tr (td "g") (td @ dir "rtl" "گ")) (tr (td "v") (td @ dir "rtl" "ڤ")) (tr (td "z") (td @ dir "rtl" "ز ظ")) (tr (td "j") (td @ dir "rtl" "ج ژ")) (tr (td "m") (td @ dir "rtl" "م")) (tr (td "l") (td @ dir "rtl" "ل")) (tr (td "n") (td @ dir "rtl" "ب")) (tr (td "r") (td @ dir "rtl" "ر غ")) (tr (td "x") (td @ dir "rtl" "خ")) (tr (td "'") (td @ dir "rtl" "ح")) (tr (td ".") (td @ dir "rtl" "ء")) (tr) (tr (td "a") (td @ dir "rtl" "ا")) (tr (td ".a") (td @ dir "rtl" "أ")) (tr (td "e") (td @ dir "rtl" "ه")) (tr (td "i") (td @ dir "rtl" "ي")) (tr (td ".i") (td @ dir "rtl" "ئ")) (tr (td "o") (td @ dir "rtl" "ۆ")) (tr (td "u") (td @ dir "rtl" "و")) (tr (td ".u") (td @ dir "rtl" "ؤ")) (tr (td "y") (td @ dir "rtl" "ى")))) (td @ style "max-width: 30vw; padding-top: 2em; vertical-align: top;" (p "This system only uses " (em "long") "vowels, thus making it easily readable and writeable. " "It also allows to represent diphthongs the same way as they are represented with the Latin orthography." (br) "Some letters have multiple equivalents. This is to allow visual diversity and avoid the unlinking of " "the first consonant, for instance when writing words starting with a ⟨d⟩:" (span @ dir "rtl" "داشرو") " vs." (span @ dir "rtl" "ضاشرو") ".") (p "Two vowels are imported from Kurdish: [ɔ] and [ε]. I've chosen to use the “ha” " "to represent the latter as a linguistical precedent exists and the “ḥa” " "is phonetically close the the sound of ⟨'⟩ ([ħ] vs. [h]) and unused.") (p "All consonants come from Standard Arabic except one which comes from vernacular Maghrebi Arabic, namely " "the “va” and three coming from Standard Persian, namely “pe”, “ge” and " "“že”. The latter is not strictly necessary, but it allows to illustrate a clear separation, for " "instance between the different " (em "rafsi") "of a " (em "lujvo.")) (p "As in " (em "rablermorna") "it is possible to eliminate vowels if the word contains more than one. " "For instance, the " (em "gismu") (code "cmene") "can be written either as " (span @ dir "rtl" "شمهنه") " or" (span @ dir "rtl" "شمن") ".") (p "For example, the following Lojban text" (blockquote "pu ze'u se djuno lei ze'u renvi gi'e se jijnu ca le temci be le nu le dzena ca jmive vau fa le" "du'u le bradi be le se nei ba klama la tlunranan.") "renders as" (blockquote @ dir "rtl" @ style "font-size: 1.3em;" "پو زهحو سه صجونۆ لهي زهحو رهنڤي گيحه سه جيجنو شا له تهمشي به له نو له ضزهنا شا جميڤه ڤاو فا له" "ضوحو له برادي به له سه نهي با كلاما لا تلونانانء")))))) (td @ style "vertical-align: top; width: 47vw; margin: 0 1.5vw 0 1.5vw;" (h4 "Hebrew — xeblermorna — " (span @ dir "rtl" "חֵבּלֵרמֹרןַ‎")) (p "This Hebrew orthograhy for Lojban cannot simply be derived from the Arabic orthography, most notably regarding " "vowels: whereas Standard Hebrew is richer than Arabic regarding consonants and vowels, the lack of diversity of " "languages using the Hebrew Alphabet prevents the existence of non-native long vowels such as the Kurdish [ɔ] " "mentionned earlier. Thus, the orthography is required to rely on diacritics, called " (em "nīqqūd") "to represent " "vowels.") (table (tr (td (table @ class "has-rtl" (tr (th @ style "padding: 0 1em 0 1em;" "Latin letter") (th (span @ style "padding: 0 1em 0 1em;" @ dir "rtl" "חֵבּלֵרמֹרןַ‎"))) (tr (td "p") (td @ dir "rtl" "פּ")) (tr (td "t") (td @ dir "rtl" "תּ‎ *ת")) (tr (td "k") (td @ dir "rtl" "כּ ק")) (tr (td "f") (td @ dir "rtl" "פ")) (tr (td "s") (td @ dir "rtl" "שׂ ס צ *ץ‎")) (tr (td "c") (td @ dir "rtl" "שׁ‎")) (tr (td "b") (td @ dir "rtl" "בּ")) (tr (td "d") (td @ dir "rtl" "דּ‎ *ד‎")) (tr (td "g") (td @ dir "rtl" "גּ‎")) (tr (td "v") (td @ dir "rtl" "ב")) (tr (td "z") (td @ dir "rtl" "ז‎")) (tr (td "j") (td @ dir "rtl" "ג‎")) (tr (td "m") (td @ dir "rtl" "מ *ם")) (tr (td "l") (td @ dir "rtl" "ל")) (tr (td "n") (td @ dir "rtl" "נ *ן‎")) (tr (td "r") (td @ dir "rtl" "ר")) (tr (td "x") (td @ dir "rtl" "ח *כ")) (tr (td "'") (td @ dir "rtl" "ה")) (tr (td ".") (td @ dir "rtl" "א ע‎")))) (td @ style "max-width: 30vw; padding-top: 2em; vertical-align: top;" (p "In this orthography also, some letters have multiple equivalents, although with one small change: " "all forms followed by a star are called " (em "sūfīt") "and can only be used at the end of a word.") (p "As in " (em "rablermorna-pa,") "diphthongs are represented using long vowels, namely “vav”" (span @ dir "rtl" "⟨ו⟩") " for " (code "u*") "diphthongs and “yod”" (span @ dir "rtl" "⟨י⟩") " for " (code "i*") "diphthongs.") (p "Vowels, except for ⟨y⟩ are directly taken from Hebrew, according to the following table " "(vowels are here placed on an “aleph”):") (table @ class "has-rtl" (tr (th @ style "padding: 0 1em 0 1em;" "Latin vowel") (th @ style "padding: 0 1em 0 1em;" (span @ dir "rtl" "חֵבּלֵרמֹרןַ‎ כַּרנץ‎ַ‎ַ"))) (tr (td "a") (td @ dir "rtl" "אַ")) (tr (td "e") (td @ dir "rtl" "אֵ")) (tr (td "i") (td @ dir "rtl" "אִ")) (tr (td "o") (td @ dir "rtl" "אֹ")) (tr (td "u") (td @ dir "rtl" "אֻ")) (tr (td "y") (td @ dir "rtl" "אָ"))) (p "As with the Arabic orthography, it is possible to eliminate vowel signs if the word " "contains more than one consonant. For instance, the " (em "lujvo") (code "prigau") "can " "be written either as" (span @ dir "rtl" "פּרִגּ‎ַו") " or" (span @ dir "rtl" "פּרגּ‎ו") ".") (p "For example, the following Lojban text" (blockquote "pu ze'u se djuno lei ze'u renvi gi'e se jijnu ca le temci be le nu le dzena ca jmive vau" "fa ledu'u le bradi be le se nei ba klama la tlunranan.") "renders as" (blockquote @ dir "rtl" @ style "font-size: 1.3em;" "פֻּ‎ ז‎ֵהֻ‎ שֵׂ דּ‎ג‎ֻ‎ן‎ֹ לֵי ז‎ֵהֻ‎ רֵנבִ גּ‎ִהֵ שֵׂ ג‎ִג‎נֻ‎ שׁ‎ַ לֵ תּ‎ֵמשׁ‎ִ בֵּ לֵ נֻ‎ לֵ דּ‎ז‎ֵנַ שׁ‎ַ ג‎מִבֵ בַו" "פַ לֵדּ‎ֻ‎הֻ‎ לֵ בּרַדּ‎ִ בֵּ לֵ שֵׂ נֵי בַּ כּלַמַ לַ תּ‎לֻ‎נרַנַנא")))))))) (hr) (h3 "A proposal for a Polish cyrillic alphabet") (p "Here is my proposal for adapting the cyrillic alphabet to suit the Polish language. Don't use it, it's terrible, but everybody makes mistakes, right?" (br) "I wanted to keep most of the differences that exist in the current alphabet, even for likewise-sounded letters." (br) "Following this principle, I tried to keep some letters that could have been omitted without impacting readability too much." (br) "This can lead to the illogical situation of the cyrillic text being the same length as the latin one, the shorthands offered by automatically managing palatalisation being left unused." (br) "I don't like digraphs, thus I used some ligatures from the Serbian cyrillic alphabet, but due to the lack of ligatures for the [ɕ] and [ʑ] sounds, I needed to pick the letters from somewhere else, but unfortunately, the letter corresponding to the [ʑ] sound is not present in any Slavic-language alphabet, thus I decided to pick it from the Tatar alphabet instead." (br) "The overall design is influenced by the Russian, Belarusian and Serbian cyrillic alphabets.") (table (tr (th "Polish letter(s)") (th "Cyrillic equivalent(s)") (th "Notes")) (tr (td "A a") (td "А a")) (tr (td "Ą ą") (td "Ѫ ѫ") (td "Stole that from Common Slavonic.")) (tr (td "B b") (td "Б б")) (tr (td "C c") (td "Ц ц")) (tr (td "Ć ć") (td "Ћ ћ")) (tr (td "Cz cz") (td "Ч ч")) (tr (td "Ci ci") (td "Ћи ћи") (td "Note that if the „ci” is followed by a vowel, the soft version of the latter shall be used, e.g. „Ciebie”: « Ћебе »." "This applies to all consonants (although the special ones mentionned in this table shall be softened using a ь or a ligature).")) (tr (td "D d") (td "Д д")) (tr (td "Dz dz") (td "Ѕ ѕ")) (tr (td "Dź dź") (td "Ђ ђ")) (tr (td "Dż dż") (td "Џ џ")) (tr (td "Dzi dzi") (td "Ђи ђи") (td "Ligatures spares us the hideous « Дзьи ».")) (tr (td "E e") (td "Э э")) (tr (td "Ę ę") (td "Ѧ ѧ") (td "See ‚ą’.")) (tr (td "F f") (td "Ф ф")) (tr (td "G g") (td "Г г")) (tr (td "H h / Ch ch") (td "Х х")) (tr (td "I i") (td "И и")) (tr (td "J j") (td "Й й")) (tr (td "K k") (td "К к")) (tr (td "L l") (td "Л л")) (tr (td "Ł ł") (td "Љ љ") (td "I first wanted to use the Belarusian « ў », but it would have lost etymology, thus I decided to use the serbian « љ », although it is originally designed for the „lj” sound.")) (tr (td "M m") (td "М м")) (tr (td "N n") (td "Н н")) (tr (td "Ń ń") (td "Њ њ")) (tr (td "Ni ni") (td "Њи њи")) (tr (td "O o") (td "О о")) (tr (td "Ó ó") (td "О́ о́") (td "For the sake of etymology. It was either this or 1) an also ugly « у » with an acute accent or 2) losing etymology.")) (tr (td "P p") (td "П п")) (tr (td "R r") (td "Р р")) (tr (td "Rz rz") (td "Р̌ р̌") (td "This sucks. I use it to preserve etymology, but it sucks.")) (tr (td "S s") (td "С с")) (tr (td "Ś ś") (td "Щ щ") (td "Decided to reuse the letter making the same sound in Russian.")) (tr (td "Sz sz") (td "Ш ш")) (tr (td "T t") (td "Т т")) (tr (td "U u") (td "У у")) (tr (td "W w") (td "В в")) (tr (td "Y y") (td "Ы ы")) (tr (td "Z z") (td "З з")) (tr (td "Ź ź") (td "Җ җ") (td "Here comes the Tatar alphabet. It looks kind of symetrical to the Russian Щ thus I like it.")) (tr (td "Ż ż") (td "Ж ж")) (tr (td "Ja ja") (td "Я я")) (tr (td "Ją ją") (td "Ѭ ѭ") (td "See also ‚ą’ and ‚ę’.")) (tr (td "Je je") (td "Е е")) (tr (td "Ję ję") (td "Ѩ ѩ") (td "See also ‚ą’, ‚ę’ and ‚ją’.")) (tr (td "Ji ji / Jy jy") (td "І і") (td "See below.")) (tr (td "Jo jo") (td "Ё ё")) (tr (td "Jó jó / Ju ju") (td "Ю ю") (td "Never seen a „jó” in my life, thus I assume that it does not exist and mix it with the „ju”."))) (br) (p "Here is the alphabet in traditional Eastern-Slavic order:" (br) (br) (b @ style "margin-left: 10em;" "А Б В Г Д Ѕ Ђ Џ Е Ё Ж Җ З " "И Й К Л Љ М Н Њ О О́ П Р Р̌ " "С Т У Ф Х Ц Ћ Ч Ш Щ Ы Ь " "Э Ю Я І Ѫ Ѧ Ѭ Ѩ")) (p "This leaves us with 46 letters (including ligatures), to 35 letters for the latin-ish alphabet, although the latter uses a lot of digraphs." (br) (br) "Following this line comes an example of the script in action on the beginning of " (em "Le Petit Prince") " by Antoine de Saint-Exupéry:") (table (tr (th (h4 "Mały Książę") (h5 "Antoine de Saint-Exupéry")) (th) (th (h4 "Мaљы Кщѭжѧ") (h5 "Антљaн ды Сaнкт-Экзупэри")) (tr (td (p "Kiedy miałem sześć lat, zobaczyłem pewnego razu wspaniały obrazek w ksziążce o dżungli" (br) "zatytułowanej " (em "Historie prawdziwe.") "Przedstawiał węża boa połykającego Iwa. Oto kopia" (br) "tego rysunku:" (br) "[rysunek]" (br) (br) "W książce tej napisano: „Węże boa połykają zdobycz w całości, bez przeżuwania." (br) "Potem nie mogą się ruszyć i zapadają w półroczny sen, w czasie którego trawią”." (br) "Odtąd sporo rozmyślałem o przygodach w dżungli, aż w końcu udało mi się nakreślić" (br) "kredką mój pierwszy rysunek. To był mój rysunek numer 1. Wyglądał tak:" (br) "[rysunek]")) (td (p " ")) (td (p "Кеды мяљэм шэщћ лат, зобачыљэм пэвнэо разu вспаниаљы образэк в кщѭжцэ о џунгли" (br) "затытуљованэй" (em "Хисторе правђивэ.") "Пр̌эдставяљ вѧжа боа пољыкаѭцэго Ива. Ото копя" (br) "тэго рысунку:" (br) "[рысунэк]" (br) (br) "В кщѭжцэ тэй написано: « Вѧжэ боа пољыкаѭ здобыч в цаљощћи, бэз пр̌эжувањя." (br) "Потэм ње мoгѫ щѩ рушыћ и западаѭ в pо́љрочны сэн, в чаще кто́рэго травѭ. »" (br) "Одтѫд спoрo розмыщлаљэм о пр̌ыгодах в џунгли, аж в коњцу удаљо ми щѩ накрэщлић" (br) "крэдkѫ мо́й первшы рысунэк. То быљ мо́й рысунэк нумэр 1. Выглѫдаљ так :" (br) "[рысунэк]"))))) (hr) (h3 "The (Internet) Voskhod Protocol — 22.VIII.2022") (p "The (Internet) Voskhod Protocol is a small Internet protocol designed for fast and simple document exchange on a small to medium size network." (br) "It is roughly similar to Gopher, while trying to fix its flaws. " "You can find its specification " (a @ href "voskhod.html" "here")) (hr) ; (h3 "Against RTFM - 2022-07-10") ; (p ; "I'm not against RTFM for the “sake of compassion and kindness” bullshit, or even for the “negative intent” thing. " ; "But I read April Wensel's article (I'm not gonna link it) on it, and I agree with her on one point: it discourages learning." ; (br) ; "I do think that, with time, a programmer should be able to be almost independent when facing errors," ; "and yes I'm pissed of when I see my 100th “why does my program crash when I try to write on a " ; (code "const char *") ; "?” of the day. " ; (br) ; "However, I think you shouldn't just answer “RTFM” to any beginner asking a question, however stupid and obvious and easy-to-find it may look to you. " ; "And why? Because most beginners don't know how to find documentation, and if they know how to, they cannot read it." ; (br) ; "That's why I think that the good method is to explain the concept to them calmly, and within your explanation, include a link to the documentation or explain how to search for it. " ; "With this method, there are good chances that they will soon be able to search by themselves before coming to you. With the RTFM-based approch, they will never be able to figure it out " ; "by themselves, and they will just completely give up sooner or later.") ; (hr) (h3 "How I license my programs — 28.IV.2022") (ul (li "If the program contains less than 300 lines of code (yes this is completely arbitrary), I use the Beerware license. " "This condition supersedes the two cases below.") (li "If the program is intended to be integrated in a bigger piece of software (such as a library) and contains more than 300 lines of code, I use the Apache License 2.0 or the GNU Lesser General Public License.") (li "If the program is intended to be fully standalone (such as a compiler) and contains more than 300 lines of code, I use the GNU General Public License version 3.0" (a @ href "#dont-or-later" "only.")) (li "If the program contains more than 1,000 lines of code (this one is " (em "also") " arbitrary), I use GPLv3.0. This condition supersedes all the cases above.")) (hr) (h3 "GPLv3 translation - 25.IV.2022") (p @ id "dont-or-later" (a @ href "./gpl-3.0-fr.html" "Here") "'s my attempt to translate the GNU General Public License version 3 into French. " "It probably contains a lot of typos and incomprehensible parts, if you spot some, please notify them to me by e-mail.") (p "By the way, quick note on the GPL, that I cannot include in the translation: please " (b "don't ") "add the “or any later version” clause to your copyright headers." (br) "Please don't accept automatically a license you didn't read. Even if GNU says that") (blockquote "Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns") (p "Those details can cause problems, like the tivoization clause caused some to quite a lot of people while updating from version 2 to version 3." (br) "So please just say “GPL-3.0-only”.")) (hr) (footer (p "Created: 25 Apr 2022, 19:15") (p "Last generated on: " ,(multiple-value-bind (out err ret) (uiop:run-program "date --rfc-3339=ns" :output '(:string :stripped t)) out)) (code @ style "float: right;" " GG/CS dpu s-/ a--- C++ UL+++ P++ L+++ E++ W++ K w--- M-() PGP++ t- 5? X R- !tv b+++ di+ D+ G++ e-")))) '("voskhod.html" . (html (head (title "The (Internet) Voskhod Protocol") (meta @ charset "utf-8") (style "p { margin-left: 30px; max-width: 72ch; text-align: justify; }" "body { display: flex; flex-direction: column; align-items: center; }" "div { width: 72ch; }")) (body (h1 "The (Internet) Voskhod Protocol") (h3 "Version 0.1.0") (div (h2 "Conventions Used in this Document") (p "The key words “MUST”, “MUST NOT”, “SHALL”, " "“SHALL NOT”, “SHOULD”, “SHOULD NOT”, " "“RECOMMENDED”, “MAY”, and “OPTIONAL” " "in this document are to be interpreted as described in BCP14.") (h2 "Abstract") (p "The (Internet) Voskhod protocol is an internet protocol designed for fast and simple " "text and binary documents lookup and exchange. This document descripes the protocol " "and explains how to implement clients and servers for this protocol. " "This document will be subject to change and each of its revisions will contain a short " "overview of the changes at its beginning. Throughout this document, this protocol " "will be referred to as simply “Voskhod” or as “The Voskhod Protocol”.") (h2 "1. Introduction") (p "Voskhod is the name of the space program developed by the USSR in the mid-60s. " "Its development started a bit before the Gemini program in the United States. " "Apart from the name, this protocol has very little to do with the Gemini Protocol; " "it is mainly inspired by Gopher, being intended to fix the “flaws” I found " "in the latter.") (p "Voskhod is a client-server protocol. It must be served over TCP/IP. " "Clients SHALL assume port 1964 when it is not specified and servers SHOULD listen " "on port 1964 and SHALL listen on an unpriviledged port. That is because 1964 is the " "year of the first crewed Voskhod flight — unsuprisingly before Gemini — " "and because unpriviledged users, for example on an academic network, should be able " "to run their own server.") (p "The Voskhod Protocol should theoretically be optimal for use on an university campus or " "a non-massive local community. It is designed to be used on small, distributed servers" ", which MAY be recorded on a central registry, with a potentially recursive architecture. " "The Voskhod Protocol presents resources with a filesystem-like organization, with filesystem " "elements being text or binary files, directories, or even link to other servers.") (p "The Voskhod Protocol presents only one kind of request, roughly similar to a Gemini request or " "an HTTP GET request. The clients and servers SHALL support a traditional URI syntax as defined " "by RFC 3986, and the “voskhod” URI scheme SHALL be used.") (p "While the Internet Gopher Protocol specifies how search servers shall be queried and respons, " "the Voskhod Protocol leaves the users free to build their own tools for this purpose. " "See section 4, “Writing Clients” for more details.") (p "The Voskhod Protocol allows for verification of servers using a SSH-key based “Trust On First " "Use” authentication system.") (h2 "2. Voskhod Sessions") (p "A typical Voskhod session goes like this:" (ul (li "Client: Sends a path to the server. The path SHALL be UTF8-encoded " "and UTF8 SHALL be supported by both clients and servers.") (li "Server Sends back its public SSH keyprint") (li "Client:" (ol @ type "a" (li "If the client already has the key associated with the server, " "the user SHALL NOT be prompted and the connection SHALL be accepted.") (li "If the client does not know the key, the user SHALL be prompted whether " "he trusts the server or not. If the user does, the key SHALL be recorded " "and the connection SHALL be interrupted."))) (li "Server: Sends its response to the client and closes the connection. See section 3, " "“Server Responses and their Handling” for more information.") (li "Client: Reads as much bytes as the server announced in its response. The client MAY " "perform end-of-stream checks. It then processes the received data and closes the " "connection. Read section 3, “Server Responses and their Handling” for " "information on how to proceed the data."))) (h2 "3. Server Responses and their Handling") (h3 "3.1. Server Responses") (p "A server response is structured as follows:" (ul (li "1 byte indicating the type of document being sent to the client. " "See subsection 3.1.1, “Document Types” for a list of " "document types that SHALL be supported.") (li "4 bytes indicating the number of bytes to be sent. Those bytes " "SHALL be big-endian encoded") (li "The actual body of the response. See section 3.1.2, “Body Format”" "for more information."))) (h4 "3.1.1. Document Types") (p "Clients and servers SHALL support at least those document types:" (ul (li "00 — An error occured. The body corresponds to the detailed error. " "See section 3.1.2, “Body Format” for information on how " "errors SHALL be returned.") (li "01 — A generic text file. The body SHALL be UTF8-encoded.") (li "02 — An " (code "uuencode") "d binary file.") (li "03 — A directory listing. See section 3.1.2, “Body Format”, for " "information on how directory listings SHALL be formatted.") (li "04 — A link. See section 3.1.2, “Body FOrmat” for a list of the " "allowed link types and their syntax.")) "Upon receiving an unknown document type, clients SHALL ask the user what to do instead of " "displaying garbage. Different document types MAY be sent by the server, it is up to the " "client and the server to agree on them.") (h4 "3.1.2. Body Format") (h5 "3.1.2.1. Errors") (p "Clients and server SHALL at least support the following errors. The error text SHALL be sent " "exactly as written." (ul (li "“Server unavailable”") (li "“Resource not found”") (li "“Rate limit exceeded”"))) (h5 "3.1.2.2. Directory listings") (p "Each resource in a directory listing is formatted using the following syntax: " (br) (code "‹TYPE›‹NAME›CRLF") (br) (br) (code "‹TYPE›") "is the document type as defined in section 3.1.1, " "“ Document Types”, spanning 2 bytes. " (code "‹NAME›") "is the UTF8-encoded name associated with the resource, representing the link to " "the resource on the server. It SHALL NOT contain any slash (‘/’, ASCII 2F) " "characters, as it is used to separate path stems. " (code "CRLF") "is an ASCII Carriage Return character (hexadecimal code 0D) followed by an ASCII Line Feed " "character (hexadecimal code 0A).") (h5 "3.1.2.3. Links") (p "There are 3 possible link types." (ol @ type "a" (li "A relative path. It is represented with a traditional UNIX-style path missing the first " "slash (‘/’) character, e.g. “folder/document.txt”.") (li "An absolute path. It is represented with a traditional UNIX-style path, e.g. " "“/documents/voskhod.txt”.") (li "A link to another server using either Voskhod or another protocol. It is represented with " "a fully-featured URL, as defined by RFC3986 using the following syntax:" (br) (code "‹PROTOCOL›://[USERNAME[:PASSWORD]@][SUBDOMAIN.]‹SLD›.‹TLD›[:PORT][/RESOURCE]") (br)(br) "E.g., “https://my.fsf.org/join”"))) (h2 "4. Writing Clients") (p "Clients SHALL understand the standard URI scheme according to RFC3986.") (p "When opening Voskhod links from a directory listing, the client SHALL follow them and SHOULD permit the " "user to follow the link in a new tab or window.") (p "Clients SHOULD allow the user to specify an application to use to open “non-voskhod” links.") (p "Clients SHOULD permit the user to open files in a specific application, either on-the-fly or depending on " "their types in a configuration file.") (p "Clients SHALL display text files and SHALL by default display other files in an pager. " "The commands used to control the pager SHOULD by default be similar to the ones used by GNU less.") (p "Clients MAY present an embedded search engine to the user. The said search engine SHALL ONLY present pages " "sorted by closeness to the query and SHALL NOT sort by commercial affiliation.") (p "Clients SHOULD do page caching of some sort. Clients SHALL NOT cache the contents of directory listings.") (p "If the client presents a search engine, the latter SHOULD make use of multithreading for indexing and search.") (p "Clients SHOULD permit the user to go back and forth in the history. Clients SHOULD permit the user to view " "more than one resource at a time.") (h2 "5. Writing Servers") (p "Servers SHALL understand the standard URI scheme according to RFC 3986.") (p "Servers SHOULD have an “About” plain text file in their hierarchy explaining " "the server's purpose and listing means of contacting the administrators.") (p "Additional security is up to the implementers. This protocol is not intended to transmit confidential data " "as it exposes no means of authentication to the user. Thus, no data protection would be useful. However, " "servers may apply protection against, for instance, (D)DoS attacks."))))))