Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

1949
LINES

< > BotCompany Repo | #1016323 // Blog Bot [DOMAIN BOT]

JavaX module (desktop) [tags: butter use-pretranspiled] - homepage

Download Jar. Libraryless. Click here for Pure Java version (19656L/141K).

!7

!include once #1028763 // helper for HttpFromFileSystem
set flag NoNanoHTTPD.

static new ThreadLocal<Bool> youtubeOff;

static int perPage = 20;
sbool pkiValidation = true;

sS rawSelfLink(S uri) { ret "/blog" + addSlashPrefix(uri); }

html {
  if (domain() == null) ret serveDelayed404();
  
  S vis = registerVisitor();
  
  try object domainAndURISwitch(uri, params);
  
  if (!eq(uri, "/") || !domainIsUnder(domain(), "botcompany.de")) {
    print("404: " + domain() + " / " + uri);
    ret serveDelayed404();
  }
  
  try object redirectToHTTPS(uri, params);
      
  ret serveBlog(uri, params);
}

sO redirectToHTTPS(S uri, SS params) null {
  if (!subBot_isHttps_defaultToTrue())
    ret subBot_serveRedirect("https://" + domain() + uri + htmlQuery(params));
}


sO serveBlog(S uri, SS params) {
  tempSetThreadLocal(youtubeOff, eq("1", params.get('youtubeOff))
    || eqOneOf(params.get('youtube), "0", "off", "no"));
  O[] linkStyle = litobjectarray("style", "color: inherit; text-decoration: underline");
  
  S uri_orig = uri;
  uri = dropPrefix("/", uri);
  int page = startsWithDigit(uri) ? parseFirstInt(uri) : 1;
  S date = params.get('date);
  
  LS allPosts = ll(
    imagePost("2023/2/20", "The curve we are after",
      #1103203, "50%",
      
      p("My future trading strategy on the LDO coin simulated over the last half year. $1,800 from a $100 investment. At least that's what the simulator says. Now running it for real to check.") +
      
      p("The blue line at the bottom is the comparison investment: Just buying some LDO for $100. It doesn't score quite as well, giving us only a profit of $+77 in 6 months.") +
      
      p("Crypto, man... either it breaks you " + b("or it makes you") + "."),
      
      left := true),
      
    /*textPost("2022/5/31", "May 2022: I doubled my investment in 2.2 days",
    
    p(targetBlank("https://agi.topicbox.com/groups/agi/Tddc937591514587e", "Details here."))),*/
    
    imagePost("2022/1/12", "Gazelle 22", #1103059, "50%",
    
    p(ahref("https://gaz.ai", "New flagship product") + " in the making. This is a product of a category that didn't exist before.
      Team reassembled. Looking for investors right now.")),

    textPost("2022/1/12", "Vaccines mandates averted?",
    
    p("Threat gone. I believe.
      Spiritual realities manifest before physical realities, so
      the information may take a while to arrive in your reality.")),
    
    imagePost("2021/11/21", "Everything will change", #1103049, "30%",
    
      p(ahref("https://www.bitchute.com/video/GHiQTVZqE6Pt/", "There are only 2 groups now."))),
      
    imagePost("2021/9/10", "Image recognition news", #1103002, "30%",
      mapToLines p(
        targetBlank("https://agi.topicbox.com/groups/agi/T8ca0db34fc106b16/image-recognizers-should-return-mathematical-proofs", "Image recognizers should return mathematical proofs"),
            targetBlank("https://agi.topicbox.com/groups/agi/T2771ec3238f217fa/gazelle-looks-at-its-own-logo-and-paints-it-red", "Gazelle looks at its own logo and paints it red")
      )
    ),
    
    textPost("2021/8/10", "Getting back into image recognition",
    p("The pieces are there. We plan to recognize computer screens (e.g. very fast text recognition) as well as photos. And why not drawings too? The approach is called Ultra-Fast Recognition.") +
    
    p("Also, a new investment from " + targetBlank("https://adaptroninc.com", "Adaptron Inc") + ". Thanks so much!") +
    
    p("Also, getting back into " + targetBlank("https://www.youtube.com/watch?v=bi2BIInFjR4", "streaming") + ".") +
    
    p("Also, crowdfunding in preparation. " + targetBlank("https://gazelle.rocks/checkout", "Reserve your AI now already!"))),
    
    textPost("2021/6/11", "Work with the Mega Team&trade; continues",
      p(targetBlank("https://bea.gazelle.rocks/124479", "mega team") + " International Collab.")),

    textPost("2021/6/11", "I presented Gazelle at a conference of the smartest people on earth",
    
    p(youtubi("LUCnzQyCUhU"))),

        textPost("2021/5/16", "A cooperation with Adaptron Inc. of Canada!",
    
      p([[I am porting their demo application ]] + targetBlank("http://www.adaptroninc.com/BasicPage/smarty-software", "Smarty") + [[ to Java.]]) +
      p([[On the way, I am
      learning about ]] + targetBlank("http://www.adaptroninc.com/BookPage/research-architecture-and-design", "binons") + [[ which are an interesting alternative
      to classical artificial neurons. For example, binons only
      come to existence when there is a need for them as opposed to
      being preallocated by a software engineer. Binons
      automatically distinguish between significant and insignificant deltas. And they form hierarchies to reach higher abstraction levels.]])),
      
    textPost("2021/4/30", "New Live Stream",
      p("It explains the AGI ideas pretty well.")
      
      + p(youtubi("M66H1S90NLU"))),
      
    textPost("2021/4/11", "Gazelle AGI Technical Pitch",
      p(ahref("https://botcompany.de/files/1400466/Gazelle+AGI+Technical+Pitch.pdf", "The Gazelle system implements the most recent advances within the symbolism approach to AI."))),
      
    textPost("2021/4/4", "AGI pattern matching",
      p(targetBlank("https://bea.gazelle.rocks/query?q=a+lot+of+sanitizer+keeps+covid+away&algorithm=Process+new+input", "First steps"))),
      
    /*textPost("2021/3/4", "Legal LSD microdoses",
      p(targetBlank("https://lsd-service.net", "Here."))),*/
      
    textPost("2021/3/4", "Voice chat about AGI with Mani",
      p(youtubi("eafdxmnsPOo"))),
    
    textPost("2021/1/8", "Joining Pays5.com",
    p(targetBlank("https://pays5.com", "New crowdfunding platform!") + " I'm now CTO there.") +
    
    p("Also, more image recognition.") +
    
    p(youtubi("3VToiitnzd4"))),
    
    textPost("2020/12/10", "Work on Gazelle resumes",
    
    p(youtubi("W-NPUlIf2cU"))),
    
    textPost("2020/11/25", "Gazelle.rocks launched",
    
    p(targetBlank("https://gazelle.rocks", "It works.")
      + " Now need content.")
      + youtubi("wC68dU5iTe0")),
    
    textPost("2020/10/15", "Gazelle AI probable launch date: Middle/End of November",
    
    p("Hopefully. Recruiting for team. " + targetBlank("https://gazelle.rocks", "gazelle.rocks") + ".")),
    
    textPost("2020/09/05", "Streaming on Twitch daily now (maybe... or maybe not)",
    p(targetBlank("https://twitch.tv/stefanreich", "Code them bots"))),
    
    textPost("2020/08/16", "Wikify.live&mdash;fastest Wikipedia search engine",
    
    p(ahref("https://wikify.live/search/yesterday,+all+my", "Try it!"))),
    
    textPost("2020/08/07", "Towards like the fastest search engine ever",
    
    p(youtubi("7hshUUs_ptw"))),
  
    textPost("2020/07/28", "Suffix tree + compression = magic?",
    
    p(youtubi("GZ_UDLh8MRc")) +
    p("We'll find out")),
  
    imagePost("2020/07/28", "Indexing Wikipedia",
    #1102945, "25%",
    
    p("for the fastest search engine ever")),
    
    textPost("2020/07/22", "A software that laughs at my jokes",
    
    p(youtubi("VLWigKUAJDU")) +
    p("Humanization in progress!")),
    
    textPost("2020/07/21", "The hunt for the sub 1 millisecond search engine",
    
    p(youtubi("GgmXoZQ-VUo")) +
    p("I'm in hot pursuit. A full-text searcher that reacts in a millisecond even with large texts.")),
    
    textPost("2020/07/17", "Server problems today [solved]",
    
    p("Hoster has a V-server overload... Should be getting fixed today. And we will move to more dedicated hardware soon.")
    
    + p("Edit: Looks like it's all solved again.")),
    
    textPost("2020/07/15", "New video",
    
    p("It's been so long!") +
    p(youtubi("LI2ow-l8mgI"))),
    
    imagePost("2020/07/11", "A booking chat bot that understands free-form date input",
    #1102942, "50%",
    p(targetBlank("https://bookbetternow.com/", "BookBetterNow") + " schedules appointments over Google Calendar, knows your business hours, sends SMS and much more. You too can get one of these cool bots for your home page for a low price!"),
    left := true, picLink := "https://bookbetternow.com/", imageTargetBlank := true),
    
    imagePost("2020/07/06", "Comparing scenarios",
    #1102940, "65%",
    p("Important AI function")),
    
    imagePost("2020/07/06", "Chat bot launched",
    #1102941, "30%",
    p(targetBlank("https://contractbox.co", "contractbox.co") + " writes your Word documents for you!"),
    left := true, picLink := "https://contractbox.co", imageTargetBlank := true),
    
    imagePost("2020/07/06", "Syntactic Learning",
    #1102939, "30%",
    p("Still using no neural networks.")),
    
    textPost("2020/06/02", [[The 3 principles of "Natural Language Assembly"]],
    p("A lower-level language that helps bridge the gap between natural language and computers.") +
    
    p(youtubi("Ltk275Gn8eA"))),
    
    textPost("2020/05/27", "LINECOMP&mdash;a compressor that sometimes beats 7-zip",
    
    p("OK, not all of the time. But it excels if you want to store many similar text files, e.g. historic versions of a source code.") +
    
    p(ahref("https://botcompany.de/files/1400390/linecomp-0.3.jar", "Download.") + " " +
      targetBlank("https://agi.topicbox.com/groups/agi/Tb2cf064c700f181c/i-made-a-multi-file-compressor-that-beats-7zip-on-real-world-data", "Info & discussion."))),
    
    imagePost("2020/05/10", "Tomii Boi: Best Q&A Bot for Discord",
    #1102922, "30%",
    
    p(ahref("https://tomii.me", "Click here for more info")),
      picLink := "https://tomii.me"),
    
    textPost("2020/05/02", "NLP-based shopping list",
    
    p(youtubi("fVJcIm7zAGQ"))),
    
    imagePost("2020/03/31", "Cruddie, your personal chat bot",
    #1102906, "15%",
    
    p("This will be a good one. Have the bot store information for you just by talking to it. " + targetBlank("https://cruddie.site", "cruddie.site.") + " Hope to add new functions daily now.")
    
    + p(youtubi("gfWTPfGDlTU") + " " + youtubi("dUKYlJ2f9RQ")),
    left := true),
    
    textPost("2020/03/18", "Speedrun continues, Pt. X",
    
    p(youtubi("XZfubRbbg58") + " " + youtubi("y5viJD0djCU"))),
    
    textPost("2020/03/15", "Fluid text files",
    
    p("A cool human- and computer-friendly text file format I have wanted for a long time. Now it's here!") +
    
    p(youtubi("fYQ603KTMM8"))),
    
    textPost("2020/03/06", "Speedrun continues",
    
    p([[Gathering AI scripts from the database by matching keywords.]]) +
    
    p([[Results & an answer to my skeptics at ]] + ahref("https://www.youtube.com/watch?v=baT5TqNSNqk&t=3520s", "58:40"))
    
    + p(youtubi("baT5TqNSNqk"))),

    textPost("2020/03/02", "Combining image recognition &amp; the logic engine, Pt. 1",
    
    p(youtubi("4L1sBLqUbNQ"))),
    
    textPost("2020/02/26", "Building an image recognition for Anki Vector, Pt. 1-3",
    
    p(youtubi("W-QE_XWmeVs") + " " + youtubi("9FMY3YUTqGM") + " " + youtubi("r6GB52sUl1o"))),
    
    imagePost("2020/02/25", "Solving the Winograd Challenge, Pt. 5",
    #1102881, "50%",
    
    p("Look, a program is forming.") +
    
    p(targetBlank("https://agi.topicbox.com/groups/agi/T21bdc2c440c86db7/my-new-anki-vector-and-first-actual-winograd-challenge-solved", "Explanations & heated discussion."))
    
    + p(targetBlank("https://www.youtube.com/watch?v=Pb70CAx-I_o", "Video.")),
    
    imageTargetBlank := true),
    
    textPost("2020/02/23", "Anki Vector! Plus: Solving the Winograd Challenge Pt. 4",
      p("Fame, here we come...") +
      
      p(youtubi("ixEmFESf3L4")) +
      
      p("Bob paid for Charlie's college education. He is very [generous/grateful]. Who is [generous/grateful]?")),
       
    textPost("2020/02/18", "Solving the Winograd Challenge (Pt. 1 to 3)",
      p("Understanding everyday scenarios.") +
      
      p(youtubi("zbaV5rs94JA") + " " + youtubi("lsXsjA2n7RA") + " " + youtubi("1mrxPK4WaLE"))),
    
    textPost("2020/02/10", "AI goes mobile. And speedrun continues",
    
    p("Check it ouuut!") +
    
    p(youtubi("W4IP3eTTfJ8") + " " + youtubi("f-WHXNWw5bg")
      )),
    
    textPost("2020/02/03", "Training a Voice Activity Detector",
    
    p("For always-on devices without Big Tech snooping. More soon.")),
    
    textPost("2020/01/19", "Speedrun to AI continues",
    
    p(youtubi("uhplXw9VsJ8") + " " + youtubi("alRzPG_JQH8") + " " + youtubi("jvHiAClDOtY") + " " + youtubi("ooSpHbUUUFA") + " " + youtubi("t_txQ4vkDlY") + " " + youtubi("d7XWxMnIUpM")) +
    p("Results growing by the day")),
    
    textPost("2020/01/18", "Auto-jump-cut your videos with this free tool",
    
    p(youtubi("eS-QsAh2pT8")) +
    
    p("Thanks to Tom for making this video! Download links " + ahref(youtubeURL("eS-QsAh2pT8"), "in the video description") + ".")),
    
    textPost("2020/01/18", "Stefan Reich about the future of JITs",
    
    p("There is no fundamental reason why JIT [just-in-time compilation] solutions should be slower than precompiled code, if you disregard warm-up time (which may actually happen before the program is shipped). In fact, mathematically, the opposite is true: JITs have the option of optimizing further at runtime which once-compilers like C++ don't have. What we currently have available is another question, but long-term, JITs will basically win the performance race.") +
    
    p("(A little sound bite you can quote)")),
   
    textPost("2020/01/02", "So what is this mystery logic engine? (and other videos)",
    
    p(joinWithSpace(lambdaMap youtubi(splitAtSpace("TuKDBeVSBoo UfezfehUBEQ WKwtl4RWqNo EO2EiqNd91A"))))),
    
    textPost("2019/11/26", "Our Services", // Don't change date, it's linked
    
    p("We provide custom chat bots at competitive prices with optional advanced features. Custom bots start as low as $50 including hosting. " + targetBlank("https://www.fiverr.com/stefan_reich/create-a-chat-bot-for-your-website-or-chat-platform", "Order now.")) +

ul(map dropMinusPrefix(tlft([[
-Bot is added to your web site by including one line of HTML
-Bot can greet every customer or pop up on click
-Bots will answer questions from a list you provide
-Bots understand typos and synonyms
-Works on desktop and mobile browsers
-Conversation with user is stored in cookie (not lost when browser is closed)
-Bot can also be deployed on any messenger platform (Slack, Discord, Telegram and Viber available, any other platform on request)
-Bots can serve input forms (e.g. contact form)
-You get a web interface where you can see all the bot's conversations
-After the bot is launched, you can edit its questions and answers in the same interface
-Bots can support multiple languages at once (English/German, other languages on request)
-Bots can send a mail, SMS, Viber message etc. to you on any event (e.g. after user completes a form)
-Bots are usually completed in 7 days or less
-Web site bots are compatible with GoDaddy site builder
-We host your bot for free for one year, after that for a small fee (5€/year)
-Bots can support additional functions like playing music in Discord voice chat
-Bots can be deployed as Windows programs
-You have the option to host the bot yourself if you have your own server infrastructure (VPS/dedicated/cloud)
]]))) +

  p("Example public bots:") +

  ul(
    ahref("https://top.gg/bot/625377645982384128", "MKLab FM") + " - plays a 24/7 EDM radio stream in Discord voice chat",
    ahref("https://top.gg/bot/602481480266153984", "GBot") + " - performs Google searches in Discord",
    ahref("https://top.gg/bot/631845126095896579", "The Owl") + " - Discord greet & farewell bot"
    ) +
    
    p("Order by " + ahref("mailto:info@botcompany.de", "mail") + " or through " + ahref("https://www.fiverr.com/stefan_reich/create-a-chat-bot-for-your-website-or-chat-platform", "Fiverr" + "."))),
  
    textPost("2019/11/25", "Chat bot released",
    
    p(targetBlank("https://mmozumder.com/", "Managing customer inquiries") + " :)")),
    
    textPost("2019/11/15", "Fiverr bots now ready within 7 days",
    p(targetBlank("https://www.fiverr.com/stefan_reich/create-a-chat-bot-for-your-website-or-chat-platform", "Updated the gig") + " as there is a ready-made bot kit.")),
    
    imagePost("2019/10/28", "Girlfriend Bot",
    #1102795, "25%",
    
    p("182 rules and 104 synonyms. Always there for you.") +
    
    p("And yes, before you ask, we can do \"boyfriend bots\" too :-D") +
    
    p("(Not the same as a real one, but what's wrong with some fun and games?)"),
    left := true),
    
    imagePost("2019/10/24", "Let's mix English and Python",
    #1102774, "25%",
    
    pre([[
theory validity {
  // a human weighs between 80 and 400 pounds
  $x is a human
    & $x weighs ($y pounds)
    => $y >= 80 & $y <= 400
   
  contradiction => say (That can't be right)
}]])

     + p("Yes, this works already. " + ahref("https://agi.topicbox.com/groups/agi/Tda20a46822c5bb8d", "Full program and some responses."))
     
     + p("So yes, the speedrun definitely continues&mdash;just without videos right now.")
     
     + p("Creating a very nice \"girlfriend\" bot with a friend too.")),
     
    textPost("2019/10/09", "Speedrun to AI",
    
    p("I code until it's done.") +

    p(youtubi("CLk_volfMR8") + " " + youtubi("MWINSJtoPFQ"))),
    
    textPost("2019/10/05", "Philosophy Bot I",
    
    p(targetBlank("http://code.botcompany.de/1025576", "Bot") + " receives facts:") +

    pre([[
RAM has a size
I have RAM
]]) +

    p("And asks:") +
  
    pre("What is the size of my RAM?") +
    
    p("To achieve this, we invent and implement a whole new language which mixes English and Python. Complete program: 299 lines.") +
      
    p(ahref(youtubeURL("JUaDwmnBTHQ"), "2:45:07 mega-stream.")) +
    
    p(youtubi("JUaDwmnBTHQ"))),
    
    imagePost("2019/10/03", "A popular comment about JavaX",
    #1102746, "25%",
    
    p("It is a good idea after all.")),
    
    imagePost("2019/09/28", "Music bot delivered!",
    #1102724, "15%",
    
    p(targetBlank(botCompany_mkLabBotLink(), "Our new bot") + " plays " +
      targetBlank("https://tinyurl.com/mklabradio", "MKLab FM") +
      ", a very nice (and free) electronic dance music radio, in " +
      targetBlank(botCompany_mkLabBotLink(), "your Discord server.")),
      
    left := true),
    
    textPost("2019/09/20", "I'll accept another investment",
    
    p("1000 € are a good number and will help this project a lot :)") +
    
    p("It can either be a gift, an investment or a bot order, depending on your wishes...") +
    
    p("Let's just talk about it.")),
    
    textPost("2019/09/28", "A bot in 40 lines&mdash;including a DSL translator",
    
    p("I introduce a new concept to JavaX&mdash;coding on the meta-level. Just write " + targetBlank("http://code.botcompany.de/1025375", tt("meta {}")) + " and put your code-making code inside the brackets.") +
    
    p("OK the concept is not completely new, but it does work exceptionally well in JavaX.") +
    
    p("In fact, we are creating and using a custom language " + targetBlank("http://code.botcompany.de/1025375", "directly within this example") + ". Oh, and there is now a shortened version with only " + targetBlank("http://code.botcompany.de/1025387", "33 lines") + ".") +
    
    p(youtubi("PFyDi1HjU2Y"))),
    
    textPost("2019/09/25", "More live coding",
    
    p("Spends the time, pays the bills.")
    
    + p(youtubi("OluvmrZnA0A"))),
    
    textPost("2019/09/21", "A bot that controls YouTube",
    
    p(youtubi("ABoAXh8ZaEk"))),
    
    textPost("2019/09/20", "selfType",
    
    p("Another functioning JavaX keyword invented in a few minutes.") +
    
    preWithIdentifierExplanations([[
class Me {
  selfType hello() { print("hello!"); this; }
}

new Me().hello().hello();
]],
  "selfType", "selfType is replaced with the enclosing class's name") +

    p("selfType just refers to the enclosing class. Avoid repetition. It really shines in combination with includes.")),

    textPost("2019/09/19", "A bot that learns synonyms",
    
    p(youtubi("0gmwaqmjKhM"))),
    
    textPost("2019/09/17", "A new concept of a program",
    
    p([[Let's say a program is something that describes itself,
    tests itself and improves itself.]])),
    
    /*textPost("2019/09/17", "7 levels (or is it 8?)",
    
    p_b("The whole stack of AI.") +
    
    pre(htmlJavaIdentifierTooltips([[
ENGLISH
  -> NL parser -> NL associated to templates
  -> function maker -> JavaX source
  -> JavaX transpiler -> Java source
  -> eclipsec -> Java byte code
  -> HotSpot -> assembler source
  -> HotSpot's assembler -> machine code
  -> a suitable CPU -> actual bit operations
]],
  "NL", "natural language",
  "JavaX", "a higher-level extension of Java")) +

  p("All of these translators exist already&mdash;except the top two.")),*/

    imagePost("2019/09/16", "Ridiculously Fast Image Recognition",
    #1102664, "50%",
    
    p("I have a special reconnaissance operation that can be performed in less than <b>2 nanoseconds</b> (sic, see benchmark to the right) on any image stored in a special smart format. Combining a few of these operations allows us to find things in that image very quickly.") +
    
    p("So in total, I expect a time of maybe, say, a millisecond?&mdash;for recognizing a typical image's major features. We still need to invent some smart algorithms for this to happen, but this is the goal.") +

    p("And what that cornerstone operation is? Welll... <i>stay tuned</i> is all I can say.")),
    
    textPost("2019/09/13", "Whenever my language bores me",
    
    p([[...I extend it. (Have I said that before? Deja vu!)]]) +
    
    p([[Let's say I am annoyed by the inability to nest a function inside a function in Java. So I invent the "embedded" keyword.]]) +
    
    pre(htmlJavaIdentifierTooltips([[
sS bla() {
  S x = "hello";
  embedded S calc() { ret x + " " + x; }
  ret calc() + " " + calc();
}
]],
  "sS", "short for: static String",
  "S", "short for: String",
  "ret", "short for: return",
  "embedded", [["embedded" allows you to put a function where they would not normally be allowed]]
  )) +

    p("In this useless but instructive example, I embed the function " + tt("calc") + " in the function " + tt("bla") + " with access to the local variable " + tt("x") + [[.]]) +
    
    p([[How is it translated? Using a function of ]] + targetBlank("http://code.botcompany.de/1025200", "a mere 21 lines") + [[ and an anonymous inner class. (Nota bene: It's currently more or less limited to a single embedded function per "mother".)]]) +
    
    p(targetBlank("http://code.botcompany.de/1025201", "Example with translation to Java."))),
    
    imagePost("2019/09/10", "A programming language that makes DOOM levels",
    #1102659, "50%",
    
    p("This is such a wonder. A compiler written in Java compiling a slightly weird, but interesting Logo-inspired special purpose language into actual DOOM levels. Our AI could produce DOOM levels for us from just a simple description.")
    
    + p("Oh, ah... " + targetBlank("https://jmtd.net/wadc/", b("link")) + ".")),
    
    textPost("2019/09/01", "This program is a Discord fan",
    
    p(youtubi("CvcafQ6YTlQ"))),
    
    imagePost("2019/08/31", "Beta Software!",
    #1102549, "50%",
    
    p("But a " + targetBlank("http://recognizer.botcompany.de", "good one") + ".")),
    
    textPost("2019/09/01", "Constructs that Java needed",
    
    p("Question-dot.") +
    pre([[c ?. setDoubleBuffered(b);]]) +
    p(b("=>")) +
    pre([[if (c != null) c.setDoubleBuffered(c);]])),
    
    textPost("2019/09/01", "Zero Training Time Neural Networks",
    
    p("New invention.")),
    
    imagePost("2019/09/01", "Paging The Reflex",
    #1102552, "50%",
    
    p("&nbsp;")),
    
    imagePost("2019/08/31", "Unix just doesn't understand me...",
    #1102550, "50%",
    
    p("Huh."),
    left := true),
    
    imagePost("2019/08/26", "Chess Board Recognition",
    #1102266, "35%",
    
    p("Coming up.")),
    
    textPost("2019/08/18", "You can help train desktop image segmentation",
    
    p(youtubi("W6eJSCGEkSE"))),
    
    textPost("2019/08/15", "Giraffe v3&mdash;now stores information",
    
    p(youtubi("gbQNejT1xdk"))),
    
    textPost("2019/08/12", "Building a simple translator in agi.blue",
    
    p("The demo is word-based, but we have a function for efficient phrase-based translation too.") +
    
    youtubi("w2gJ63tvTW8")),
    
    textPost("2019/08/12", "An array with O(log n) time for all operations",
    
    p("I invented a new data structure (I think). It's an array (variable-size list) where each add, remove, update and random access completes in O(log n) time.") +
    
    p("I call it a " + targetBlank("http://code.botcompany.de/1024413", "Log-N array") + ". The implementation uses an order statistic red-black tree. This could be nice for handling long token lists during JavaX transpilation.")),
    
    imagePost("2019/08/11", "Today I wrote a whole bot",
    #1101842, "25%",
    
    p("...live on stream. Sadly, frame rate dropped to 6 frames a minute at some point. Hopefully fixed next time. " + targetBlank("https://www.twitch.tv/videos/465661725", "Video here.")
    + " " + targetBlank("http://code.botcompany.de/1024415", "Code made."))),
    
    textPost("2019/08/10", "Live Coding For Nerds",
    
    p("Stefan Reich builds agi.blue, the Google-killing AI database & chat bot making platform. New functions built: Inter-slice links, Delete page, Checkboxes.")
    + youtubi("7ZRvktYYHuk")),
    
    textPost("2019/08/09", "I did my first live-coding stream",
    
    p([[...and now it is ]] + targetBlank("https://www.twitch.tv/stefanreich", "lost") + [[ because I didn't click "Save broadcast". Was fun though, thx to Lemon for participating.]])
    
    + p([[And of course, code got made. Specifically, agi.blue slices now have ]] + targetBlank("https://agi.blue/?slice=jbmjskptrptihmzk", "owners") + ".")),
    
    textPost("2019/08/04", "\"Be Thankful\"",
    
    p("Randall Brown &amp; band (including me).") +
    
    youtubi("debRuSo8CZk")),
    
    textPost("2019/08/04", "Why AGI.blue beats Google",
    
    p("Because White-Box.") +
    
    youtubi("bwUE_XJMbok")),
    
    imagePost("2019/08/01", "Let's make programs",
      #1101823, "40%",
    
      p("...that understand everything.")),
    
    textPost("2019/07/28", "Revamping agi.blue",
    
    p(targetBlank("https://agi.blue", "agi.blue") + " now has a query language that looks like this:")
    
    + pre([[
word types / is plural of / $x
$y / is a / $x
return $y
]])

   + p("This example " + targetBlank("https://agi.blue/bot/query?query=word+types+%2F+is+plural+of+%2F+%24x%0A%24y+%2F+is+a+%2F+%24x%0Areturn+%24y", "queries the database") + " for a random " + targetBlank(agiBlue_linkForPhrase("word type"), "word type") + ".")),
   
    /*textPost("2019/07/26", "Devastating HTTPS bug in JDK 11+12; fix might be coming",
    
    p("This really needs to be fixed. Can't upgrade my web server. "+ ahref(tb_mainServer_pretty() + "/ssl-bugreport.tgz", "Demonstration for download."))
    
    + p("Update: This seems to be fixed in JDK 13 which is nearing general release. Very nice!")),*/
    
    imagePost("2019/07/25", "GBot googles in your Discord",
    #1101771, "20%",
    
    p("Hey ho, we got " + targetBlank("https://discordbots.org/bot/602481480266153984", "our bot") + " approved. You can " + targetBlank("https://discordapp.com/api/oauth2/authorize?client_id=602481480266153984&scope=bot&permissions=0", "invite it") + " to your Discord group if you have one.")),
    
    textPost("2019/07/14", "Coarse Procedures &amp; Power Words",
    
    p(targetBlank("http://code.botcompany.de/1023890", "Coarse Procedures.") + " " + targetBlank("http://code.botcompany.de/1023964", "Power Words.")) +
    
    + p("Concepts we need.")),
    
    textPost("2019/07/08", "AI Does Simple Reading Comprehension",
    
    p("Consider this text:")
    
    + pre([[
First, I wake up. Then, I get dressed.
I walk to school. I do not ride a bike.
]] + targetBlank("https://lingua.com/english/reading/my-day/", "[...]") + [[

Question 1: What happens first?

  1 Get dressed   2 Wake up
  3 Eat lunch     4 Walk to school
  
[+4 more questions]
]])

    + p(targetBlank("http://code.botcompany.de/1023742", "Program that solves this.") + " (One screen of code as always.)")
    + p("The engine is pretty generic. It works by correlating words in the text, the question and the answer. The only additional information we put in is a list of \"important words\"&mdash;this time in the form of " + i(targetBlank("https://www.vogella.com/tutorials/JavaRegularExpressions/article.html", "regular expressions")) + ":")
    
    + pre_htmlEncode([["(?<!not )like", "not like", "dinner", "school", "bed"]])
    
    + p([[The first expression matches on "like", but not on "not like" which avoids some confusion.]])
    
    + p([[(Why do we have to put in these regular expressions? Well, the AI is young, so we help it out a little bit. The semantic knowledge the AI gathers in these exercises will eventually allow it to function without human help.)]])
    
    + p("Now on to more challenges!")),
  
    imagePost("2019/06/30", targetBlank("https://agi.blue", "agi.blue") + " &mdash; " + targetBlank("http://an-agi-is-a-web-server.agi.blue", "An AGI is a web server"),
    #1101682, "25%",
      p(targetBlank("https://agi.blue", "agi.blue") + ". Ask anything.")
    + p(youtubi("b6jtRdV3Ev8"))
    + p("Yeah it's pretty empty. Let's fill it! Just talk. No limits.")),
    
    imagePost("2019/06/27", "We can now build bots for Gitter",
    #1101680, "50%",
    p("Integrating with the world. " + targetBlank("https://gitter.im/qanda-api/Lobby", "A friend's room") + " with some bots.")
    + p("My " + targetBlank("http://code.botcompany.de/1023546", "JavaX Gitter implementation") + " which is about a million times shorter than anyone else's&mdash;only one screen of code.")),
    
    imagePost("2019/06/23", "When bots work together",
    #1101670, "15%",
    p("Hello Monkey &amp; Gazelle."),
    left := true),
    
    textPost("2019/06/13", "My Fiverr Intro",

    p("Yeah it's unscripted. Geniuses work like that.")
    
    + youtubi("hHsnHuDRGOQ")),
    
    textPost("2019/06/11", "Android assistant is coming back",
    
    p("...now with multi-user support. Download " + ahref("http://android.tinybrain.de", "here") + ".")
    
    + p("No it's not in the play store. Blame Google.")),
    
    textPost("2019/06/15", "Proof that StackOverflow is broken",
    
    p(targetBlank("https://stackoverflow.com/questions/56605840/how-to-stream-a-windows-contents-to-a-video-file-using-gstreamer", "Original post.") + " Oh my! It is on the wrong subsite. What do they do? Do they move it? No&mdash;they lock it. Classic StackOverflow admin malfunction.")
    
    + p("So we " + targetBlank("https://superuser.com/questions/1449094/how-to-stream-a-windows-contents-to-a-video-file-using-gstreamer", "move it ourselves") + ". What will happen next?")),
    
    /*textPost("2019/05/31", "Julian Assange is being killed",
    
    p("UK government " + ahref("https://www.youtube.com/watch?v=tJPbZuaqh8w", "finishes the job") + ".")),*/

    textPost("2019/05/17", "The 3 mental spaces",
    
    p("Human, computer, objective.")
    + youtubi("W3mm7GUN7dE")),
    
    textPost("2019/05/15", "I want to build a team now",
    
    p("No more working alone!")),
    
    textPost("2019/05/15", "Our brains have 2 parts",
    
    p("...and they're (probably) not the ones you think.")
    + youtubi("qIEuvJSy06o")),
    
    /*textPost("2019/05/02", "Beer &amp; Hamburg",
    
    p("Blubb") +
    youtubi("muTDaOiTwC8")),*/

    textPost("2019/05/02", "Phrase Corrector",
    
    p("Approaching AI, chapter 915423") +
    youtubi("qVjndUIivoY")),
    
    textPost("2019/04/30", "One User Second",
    
    p("...should be enough time for a bot to respond.") +
    youtubi("F9FCV8SVpnA")),
    
    textPost("2019/04/29", "The two fundamental ways to make a chat bot",
    
    p("") +
    youtubi("l7Nbk7qAR5M")),
    
    textPost("2019/04/23", "Recognizing things on a screen",
    
    p("More edutainment for your pleasure!")
    + youtubi("tq6uBfbAClc")),
    
    /*textPost("2019/04/23", "Is society stable?",
    
    p("An important question!")
    + youtubi("IcfuXjQh3Bs")),*/
    
    textPost("2019/04/19", "First easter without a death wish",
    p("Now if that isn't a change. Videos about AI coming.")),
    
    imagePost("2019/04/04", "Whenever my language bores me",
    #1101627, "40%",
    p("...I shorten it. Let's say I want to make a big input field with full persistence and switchable font size (like you see on the right). Then I write " + ahref("http://code.botcompany.de/1022742", "this") + ":")
+ [[<pre style="clear: both"><span title="compact module (sharing common code)" style="border-bottom: dotted 1px">cmodule</span> BigInput {
  <span title="short for: String" style="border-bottom: dotted 1px">S</span> text; // auto-persisted string field
  <span title="A field that can be changed through the module's popup menu" style="border-bottom: dotted 1px">switchable</span> int fontSize = 40;
  <span title="short definition of the visualize() function" style="border-bottom: dotted 1px">visual</span> <a title="setFontSize" style="text-decoration: none; color: black; border-bottom: dotted 1px" href="http://code.botcompany.de:8081/tb/show-snippet.php?id=1007197">setFontSize</a>(fontSize, <a title="dm_textArea - synonym of dm_fieldTextArea" style="text-decoration: none; color: black; border-bottom: dotted 1px" href="http://tinybrain.de:8080/tb/show-snippet.php?id=1021496">dm_textArea</a>(<span title="string constant, &#34;text&#34;" style="border-bottom: dotted 1px">'text</span>));
}</pre>]]
    + p("(I just created the 2 new JavaX syntax constructs " + ahref("http://code.botcompany.de/1022743", "'switchable'") + " and " + ahref("http://code.botcompany.de/1022746", "'visual'") + " in like 10 minutes. Hover over the source code for more info.) &mdash;" + ahref("http://botcompany.de/1004590/raw/1101628", "Automatic popup menu."))
    ),
    
    textPost("2019/03/31", "New stuff to test",
    p("If " + ahref("https://botcompany.de/files/1400204/dialog-kit-dummy.jar", "this") + " runs, you're read-d-dy for making a bot. (Actual software coming up.)")),
    
    /*textPost("2019/03/27", "New domain",
    
    p("dialogkit.xyz [in preparation] - in two minutes to your bot. And it's free")),*/
    
    textPost("2019/03/27", "From dialog to chat bot 101",
    p("(In a few steps, that is.)")
    + pre([[
What time is it?
It's 5:30
Why did you say that?
Because you asked me what time it is.
]])),

    imagePost("2019/03/26", "Bots now available 'standalone'",
    #1101625, "50%",
    p("One huge jar file. Includes a GUI and a database. And learns from the cloud while running.")),
    
    imagePost("2019/03/24", "Gazelle",
    #1101622, "30%",
    
    p("...will explain itself (as a general principle)."), left := true),
    
    textPost("2019/03/17", "First professional bot being built",
    p("Not sure if I'm allowed to tell you more yet... :-)")),
    
    textPost("2019/03/22", "My OS is really happy with 8 GB of RAM",
    p("...and any Windows installation. Enough space for AI experiments&mdash;and enough space for memory-hungry Firefox. " + ahref(osInstallerLink(), "Try it out") + " yourself!")),
    
    imagePost("2019/03/11", "Accommodating human stuttering",
    #1101580, "35%",
    p([[Yes, it's all automatic. The original rule is just matching for ]] + ahref("http://gazelle.botcompany.de/rule/caehawgpuyqsdiig", [["what's the rule count"]]) + ".")),
    
    textPost("2019/03/07", "Coder muscle flexing :)",
    
    p("Sometimes I just have to do this&mdash;coming up with a really intelligent little solution for common coding questions that, oddly, don't seem to have an answer yet.")
    
    + p("Like this one: " + ahref("https://codereview.stackexchange.com/questions/106761/find-if-the-prefix-of-the-string-exists-in-the-values-of-the-hash-table/214969#214969", "How to find out efficiently whether a prefix of a string is contained in a tree set") + ".")
    
    + p("PS: Haha, now StackOverflow is saying they want to delete the answer. I was improving on another answer which apparently is not being deleted? StackOverflow is complete madness as I have said before.")),
    
    textPost("2019/03/07", "Mini-investment needed",
    p("Sorry... I can't <i>always</i> turn water to wine. Need some grapes. " + ahref("https://www.meetup.com/Artificial-Intelligence-Meetup/messages/boards/thread/52050719", "Details."))),
    
    textPost("2019/03/06", "I just made Gazelle scalable",
    p("10,000 rules shouldn't be a problem at all. We do want " + ahref("https://en.wikipedia.org/wiki/Artificial_general_intelligence", "AGI") + ", don't we?")),
    
    imagePost("2019/03/03", "Gazelle is offended",
    #1101557, "15%",
    p("No further comment."), left := true),
    
    imagePost("2019/03/02", "Gazelle's Auto-Math Module",
    #1101549, "30%",
    p("Given these example dialogs:")
    + pre_rtrim([[
  10 games of 2 minutes each => that makes 20 minutes
  30 games of 3 minutes each => that makes 90 minutes
    ]])
    + p("Gazelle understands what kind of calculation you mean and performs it for you on new input.")),
    
    imagePost("2019/02/24", "Gazelle Learns",
    #1101499, "50%",
    
    p("Come join us over at " + targetBlank(nextGenBotsDiscordInvite(), "Discord") + "."),
      left := true),
    
    textPost("2019/02/22", "New Discord Group",
    
    p(targetBlank("https://discord.gg/SEAjPqk", "See you there!"))),
    
    imagePost("2019/02/16", "Analyzing Wikipedia",
    #1101493, "50%",
    p("Nothing can stop this.")
    + p("In other news, my current cash level (for the rest of the month) is roundabout 10 €. Money is such a great invention!")),
    
    imagePost("2019/02/15", "Gazelle growing",
    #1101483, "50%",
    p(b("Here soon.")), left := true),
    
    imagePost("2019/02/11", "A new logic engine",
    #1101482, "40%",
    
    p("A logic engine is what makes machines talk.")
    + p("This new one I'm making is really impressive.")
    + p([[The new engine merges syntax and semantics; allows humans to teach the machine how to think easily; and it doesn't require a full model of the language in question (say, English).]])
    + p([[Surely it needs a cool code name, right? How about... uhm... <b>"Gazelle"</b>? "Panther"? Goldfish? Rubber duck? Something!]])
    + p("Either way: <b>Expect demos soon.</b> Until then, enjoy the chewing gazelle.")),
    
    textPost("2019/02/08", "Who smokes dope?",
    
    p("Input:")
    + pre("I visited the pope. He smokes dope.")
    + p("Output:")
    + pre("I visited {the pope} [*1]. He [1] smokes dope.")
    + p([[([*1], [1] and the curly braces mean that "he" points to "the pope".)]])
    + p(ahref("http://code.botcompany.de//1021323", "Function that does this."))),
    
    textPost("2019/02/06", "Ways to eat pizza",
    
    p(targetBlank("http://mattmahoney.net/", "Matt Mahoney") + [[ recently gave this little example of ways in which language is ambiguous:]])
    
    + pre([[
I ate pizza with a fork.
I ate pizza with pepperoni.
I ate pizza with Bob.
]])

     + p([[I was inspired to make a program to interpret these different meanings of the word "with". I used the 3 lines as training examples, then made some new examples for testing.]])

     + p([[My program is a logic engine that takes the following rules:]])

     + pre([[
// Some reasonings that everybody will understand.
// Sorry for the curly braces, we have to help out the parser a tiny bit.
// First, the 3 different cases of what "pizza with..." can mean.

  I ate pizza with pepperoni.
  => {I ate pizza} and {the pizza had pepperoni on it}.
  
  I ate pizza with Bob.
  => {I ate pizza} and {Bob was with me}.
  
  I ate pizza with a fork.
  => I used a fork to eat pizza.
  
// Now some more easy rules.
  
  I used a fork to eat pizza.
  => I used a fork.
  
  I used a fork.
  => A fork is a tool.
  
  The pizza had pepperoni on it.
  => Pepperoni is edible.
  
  Bob was with me.
  => Bob is a person.

// Some VERY basic mathematical logic

  $A and $B.
  => $A.
  
  $A and $B.
  => $B.

// Tell the machine what is not plausible

  Mom is edible. => fail
  Mom is a tool. => fail
  anchovis are a tool. => fail
  anchovis are a person. => fail
  ducks are a tool. => fail
  ducks are a person. => fail
  my hands are edible. => fail
  my hands are a person. => fail
]])

   + p([[The logic engine performs some analogy reasoning using the rules stated above. Note that most of the rules don't distinguish between variable and non-variable parts, this is usually inferred automatically.]])

   + p([[That's it! Now we give the program the following new inputs:]])

   + pre([[
  I ate pizza with mom.
  I ate pizza with anchovis.
  I ate pizza with ducks.
  I ate pizza with my hands.
]])

  + p([[...and it comes up with these clarifications:]])

  + pre([[
I ate pizza with anchovis. => I ate pizza and the pizza had anchovis on it.
I ate pizza with ducks.    => I ate pizza and the pizza had ducks on it.
I ate pizza with mom.      => I ate pizza and mom was with me.
I ate pizza with my hands. => I used my hands to eat pizza.
]])

  + p([[
So nice! It's all correct. Sure, nobody would say "the pizza had ducks on it", but that is the most reasonable interpretation of the rather bizarre input sentence after the program eliminated the other two options (ducks as a tool or ducks as a person).]])

  + p([[If you remove the line that says ducks are not persons, the program will correctly add the interpretation "I ate pizza and ducks were with me."]])

  + p(targetBlank("http://code.botcompany.de/1021251", "Full program in my fancy language."))

  + p([[In addition to the results, the program also shows some lines of reasoning, e.g. failed lines:]])

  + pre([[
Interpretation: I ate pizza and the pizza had mom on it.
   => I ate pizza.
   => the pizza had mom on it.
     => mom is edible.
       => fail
]])

   + p([[and successful lines:]])

   + pre([[
Interpretation: I used my hands to eat pizza.
   => I used my hands.
     => my hands are a tool.
]])

   + p([[Why did I make a specific program for this puzzle? Well, it's not a special-purpose program really. It's a general-purpose logic engine that supports problems of a certain complexity. Like a child understands everything as long as it's not too complicated. The plan is to make increasingly more capable logic engines until we can solve everything.]])

    + p([[The program itself is ]] + targetBlank("http://code.botcompany.de/1021251", "&lt;100 lines") + [[ (not counting rules and input), but of course it uses some powerful library functions.]])),

    imagePost("2019/09/04", "New Module Preview",
    #1101481, "50%",
    
    p("Comin' up.")),
    
    textPost("2019/02/03", "English to Rule",
    
      p("<b>Input</b> (plain English, not executable):")
    + pre("If something is heavy, it weighs many grams")
    + p("This should be converted to this <b>rule</b> which is executable:")
    + pre("fact($something is heavy) => fact($something weighs many grams)")
    + p("<b>Actual program</b> that does the conversion:")
    + pre(ahref("http://code.botcompany.de/1021228", "ai_ifToFactRule_2") + [[(
  "If something is heavy, it weighs many grams",
  litciset("it"),       // pronouns
  litciset("something") // nouns
)
]])
    + p("As you see, the only customization the function requires is a list of pronouns and nouns.")
    + p("Finally, we can <b>test</b> the new rule.")
    + pre([[
ai_applyFactToFactRules(
  "fact($something is heavy) => fact($something weighs many grams)",
  "John is heavy")
]])
    + p("which yields:")
    + pre([=[[John weighs many grams]]=])
    ),
    
    textPost("2019/02/03", "Switching back to Chrome",
    
    p("YouTube is unusable on Firefox. It's " + ahref("https://www.tubefilter.com/2018/07/25/youtube-slow-firefox-chris-peterson/", "probably deliberate") + ". That's what you get from a monopoly...")),
    
    textPost("2019/01/23", "Machine Asks Questions",
    
      p("Artificial philosopher in the making.")
    + p(youtubi("3OD8l25EJ90"))),
    
    textPost("2019/01/20", "Collaboration with AIRIS?",
    
    p("Here's an " + targetBlank("https://github.com/berickcook/AIRIS_Public", "interesting project") + " for reinforcement learning which, just possibly, may be a good addition to my software infrastructure.") +
    
    p("There is a language gap to bridge (Python/JavaX), but that's what we went to university for, didn't we?")),
    
    textPost("2019/01/12", "The Best Play List",
    
    p("Just thought I'd share this. " + targetBlank("https://www.youtube.com/watch?v=TcVv-hfsMy8&index=1&list=PLI8CaFciVcxjC2o0RQsnKc4Nf4l31e8Xd", "A literal remix heaven") + " by The Reflex.")),
    
    textPost("2019/01/09", "JavaX vs Smalltalk [the programming language]",
    
    p([[You see, I do know a bit of history. I was part of the Smalltalk
    movement 'cause yeah, that thing has a tremendous charme. Miles ahead of everything.]])
    + p([[In fact, it just dawned on me, JavaX offers a lot of the fabulous Smalltalk experience&mdash;an integrated virtual machine where
    source, runnable code, GUIs and orthogonally persistent data intersect each other.]])
    + p([[So where did Smalltalk ]] + a("fail", title := [[IMO, Smalltalk relied too much on a monolithic "system image" to hold both code and data, making code versioning and distribution very hard.]]) + [[? Mouse over for more info. And no, JavaX does not suffer from the same problem.]])),
    
    textPost("2019/01/06", "Tabs++ (or: avoiding the complexity problem)",
    
    p(youtubi("FoAJLMbctoQ"))),
    
    textPost("2019/01/04", "Why a Java OS? The \"Kilroy\" Demo",
    
    p("Because a next generation OS just has more smartness.")
    
    + p(youtubi("2AdbbSf3y-M"))),
    
    textPost("2019/01/02", "Frantic action",
    
    p("I want to finish the big project now: the talking operating system.")),
    
    textPost("2019/01/01", "I should be a CEO",
    
    p("I'm the right man for the job. I understand technology, people&mdash;and I understand the madness that money represents. Also I don't have to do " + ahref("https://www.thisisinsider.com/elon-musk-reportedly-terrified-tesla-staff-with-his-firing-sprees-2018-12?utm_source=quora&utm_medium=referral", "this") + ".")),
    
    /*textPost("2018/12/31", "Cryptography is scary",
    
    p("...but I got it working fine&mdash;see this website's nice new HTTPS certificate (check the lock icon in your browser) which will be good for another full year.")),*/
    
    imagePost("2018/12/30", [[The "Third Wave of AI"]],
    #1101469, "",
    
    p([[In the generally quite rotten IT industry, there is now talk of a "third wave of AI". And, interestingly,
    this time they float pretty much <b>the ideas I have been pushing for the last 5 years</b>.]])
    
    + p([[Although of course it's fair to say I still have a lot of tricks in petto they didn't even conceive yet.]])
    
    + p([[So is now the time for change?]])),
    
    /*textPost("2018/12/30", "I have 4 servers now",
    p([[...registered with 4 different companies, no less. (Diversify!) All nice little Linux v-servers. Interestingly, the hosting companies are all German&mdash;for unknown reasons, American v-servers are crazy expensive.]])
    
    + p([[In fact, for less than 10 bucks, I can rent a decently fast server for one month. By running a single shell script, I get it up and running, including a VNC-based GUI and my fabulous Java OS. Tell me again why I would need the Amazon cloud?]])),*/
    
    textPost("2018/12/22", "Humanity is still cursed",
                
                p("You realize that right? That humanity is nowhere near as free, enlightened and happy as it could be?")
                
                + p("The main reason is that they still believe in \"competition\" instead of collaboration... so almost nobody gets anything done.")
                + p("Happy Christmas! (?)"))
                
                , textPost("2018/12/19", "More information about JavaX",
                
                p(ahref("http://javax.botcompany.de/", "Finally... :)")))
                
                , textPost("2018/12/14", "Downloads Fixed",
                
                p("So sorry&mdash;there was a bug in the download files causing installation to fail for new users. Now fixed!"))
                
                , textPost("2018/12/13", "Teaching Colors, Hands-Free",
                
                p(youtubi("JhBhqdpuFf8")))
                
                , imagePost("2018/12/10", [["Alexa Mode" Works]],
                #1101451, "60%",
                p([["Alexa Mode" means the computer always listens. Standard feature of my OS.]]), left := true)
                
                , imagePost("2018/12/10", "New Language",
                #1101450, "60%",
                p("It's a lower-level natural language. Can you read it?"))
                
                , imagePost("2018/12/09", "Circle Finder",
                #1101449, "30%",
                
                p("God I love image recognition. ")
                
                + p(targetBlank("http://code.botcompany.de/1020191", "Source.") + " Ships as part of my operating system."), left := true)
                
                , imagePost("2018/12/06", "Nice little reload buttons",
                #1101445, "23%",
                
                p("Whenever there is new code, one click suffices to get it.")
                
                + p("In other news, I am looking for a part-time Java job (maybe). Anyway... something's gotta happen."))

                , textPost("2018/12/04", "Onboarding Demo",
                
                p(youtubi("l09WeK6uHSE")))
                
                , textPost("2018/12/04", "Ordering computers from the universe",
                
                p("Can it work?"))
                
                , textPost("2018/12/02", "Computer insults me",
                
                p("New frontier in computer science. " + targetBlank("http://code.botcompany.de/1019961", 35, linkStyle) + " code lines.")
                
                + p(youtubi("XTN0Z60_k00")))
                
                , imagePost("2018/12/02", "My own VNC clone",
                #1101444, "30%",
                p(targetBlank("http://code.botcompany.de/1019894", "Comes for free", style := "color: inherit; text-decoration: underline") + " with my OS. Both sides can be behind firewalls. " + targetBlank("http://code.botcompany.de/1019873", "GIF recorder", style := "color: inherit; text-decoration: underline") + " also included."))
                
                , imagePost("2018/11/28", "Defeating Java Class Loaders",
                #1101439, "40%",
                p("<b>Java is great</b>, but its need for class loaders means it's somewhat hard to add code at runtime.")
                
                + p(targetBlank("http://javax.botcompany.de", "<b>JavaX</b>", style := "color: inherit") + " comes to the solution! I have implemented an arsenal of tricks that turn Java into something just about as flexible as JavaScript&mdash;while retaining the full power and speed of the Java VM.")
                
                + p("In fact, in JavaX, we write and ship only source code; all compilation is done on the fly.") +
                
                + p("We can pretty much do the \"holy trinity\": maximum speed, complete freedom of assembly and compact code size&mdash;all at once.")
                
                + p("Also, JavaX has \"zero-effort deployment\": Every new line of code you write anywhere is available everywhere immediately. (If you want that.)")
                
                + p("As proof for JavaX's elegance, here's the " + targetBlank("http://code.botcompany.de/1016081", "27 lines source code") + " of the module on the right."))
                
                , textPost("2018/11/27", "Why are my dreams better than reality?",
                p("I have the greatest dreams... then I wake up to a rather lame reality. How is that even possible?"))
                
                , imagePost("2018/11/25", "Much News!",
                #1101430, "50%",
                p(ahref(osInstallerLink(), "OS") + " becomes a Cluster OS.")
                + p("(Meaning, you can treat 3 PCs as one.)"))
                
                , imagePost("2018/11/17", "OS Chat Bot v1",
                #1101424, "35%",
                p("Come on! Talk to me!"), left := true)
                
                /*, textPost("2018/11/25", "Microsoft Meditation",
                p(youtubi("nWbD1bFqvOE"))
                + p("6 minutes."))*/
                
                , textPost("2018/11/11", "Eyebrow Detection",
                
                  p(youtubi("-XafiqgFM9k"))
                + p("I promised&mdash;and I delivered :)")
                + p("(This is an example of how even the smallest facial expressions can be used for making a better user interface.)"))
                
                , textPost("2018/11/10", "Some Live Programming",
                
                  p(youtubi("U2Kl4FY-jcE"))
                + p("Bad audio, good content."))
                
                , textPost("2018/11/10", "AI Testers Wanted!",
                
                p("All you need is a Windows, Linux or Apple PC and some enthusiasm. We make voice assistants that will ease your life and provide a lot of entertainment.")
                
                + p("To participate, either " + targetBlank("http://download.tinybrain.de", "download") + ", " + targetBlank("mailto:info@botcompany.de", "mail") + " or " + targetBlank("https://github.com/stefan-reich/StefansOS/issues", "create issues") + "."))
                
                , imagePost("2018/11/06", "Checking Log Files",
                #1101418, "50%",
                p("This task may seem trivial to you, but actually it is a key to computer intelligence."))
                
                , textPost("2018/11/04", "To Andrzej",
                
                p(youtubi("https://www.youtube.com/watch?v=9P1fF0liFtU")))
                
                , textPost("2018/10/30", "Next meetup on Nov 15", 
                
                p(targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/events/255936823/", "Hamburg.") + " Hoping to prepare a fully intelligent machine until then :D"))
                
                , textPost("2018/10/28", "Making a Voice Activity Detection",

                p("Another one day project. OK, maybe two... I'm squeezing some other AI things in."))
                
                , textPost("2018/10/28", "I'm disappointed with YouTube views",

                p("1 view on the latest video? Really?"))
                
                , textPost("2018/10/27", "Making a face recognition",

                p("Now things get real.")
                + p(youtubi("FXJVO2fWztk", 450)))
                
                , imagePost("2018/10/25", "Sensory Status: +3",
                #1101412, "30%",

                p(b("Internet, Vision, Sound.") + " (A robot's basic needs.)"),
                left := true)
                
             /*   , textPost("2018/10/23", "Creator Awards once again awards the wrong creators",
                
                p("What can you say... Americans."))*/
                
                , imagePost("2018/10/21", "Faking The Linux Task Bar",
                #1101408, "50%",
                
                p("Anything's possible."))
                
                , imagePost("2018/10/15", "JavaX makes the impossible possible",
                #1101403, "30%",
                
                p("Here: Automatically measuring the RAM consumption of individual modules within one Java VM."),
                left := true)
                
                , textPost("2018/10/14", "Speech recognition works",
                
                  p(youtubi("yFEiIWW-heE", 450, 450*9/16))
                + p("Who says you need Google for everything?"))
                
                , imagePost("2018/10/10", "Making my own speech recognition",
                #1101401, "15%",
                p("It may be possible."))
                
                , textPost("2018/10/04", "We are making a bot net",
                p("...of the good kind. In fact, you are part of it <i>right now</i>.")
                + p("(It works through JavaScript in the browser. We're not using it yet though, you're just on idle.)"))

                , textPost("2018/10/03", "Let's sign stuff!",
                p("I propose to use asymmetric cryptographic keys for <i>testifying</i> that a certain thing actually happened.")
                +p("In JavaX, making a public+private key pair is just a single function call:")
                
                +hsourcecode([[pki_newKeyPair()]])
                
                +p("...which means we can have as many key pairs as we like.")
                +p("For example, you can use one specific key (or multiple) to sign your personal quotes. The signed data will speak for itself if one knows that the key is yours.")
                
                +hsourcecode([[
                On October 3rd 2018, I truly said: Oh screw this!

Edgar the 3rd himself

sig: MC0CFQCWUB9j0c+8e8wagTNmMXs/cq7tuAIUEoXOBbRvw343wOdunTY47rKrUDE=
signer: publickey:MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4E [...] F9Kg=
]]))
             
                + aname('creatorawards, textPost("2018/09/29", "Applying for Creator Awards",
                p(youtubi("ZTiqIEbhB8A", 300))
                + p("Thanks to Andrzej for video production!")))

                , textPost("2019/09/25", "Dogs Are Telepathic",
                p(targetBlank("https://www.sheldrake.org/files/pdfs/papers/JSE_Vol14.pdf", "Proof.") + " Maybe bots can be too?"))
                
                , imagePost("2019/09/20", "Programming In Facts",
                #1101379, "55%",
                p([[German, this time.]]))
                
                , imagePost("2019/09/04", "Bot Simulator",
                #1101378, "75%",
                p(b([[Version 1.]])), left := true)
                
                , imagePost("2018/08/28", "Voice-to-voice bot",
                #1101376, "50%",
                p([[We now have voice recognition &amp; speech output combined into the ]] + targetBlank("http://t.me/Hello_Computer", "Telegram bot") + [[. Actual sci-fi!]])
                + p([[(PS: The bot said "Good evening dudes".)]])
                + p([[PPS: The Rubik's cube will have to wait a little...
                building foundations first.]]))
                
                , imagePost("2018/08/18", "Teaching the Rubik's cube to the bot",
                #1101372, "30%",
                p("It's a good idea and just about right complexity-wise."),
                left := true)
                
                , imagePost("2018/08/18", "Nice trend",
                #1101371, "",
                p("Changing history " + targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/", "on Tuesday") + "."))
                
                , imagePost("2018/08/17", "The Study Of Rules",
                #1101367, "50%",
                p("It's the duality&mdash;executing &amp; thinking&mdash;that makes this project work."))
                
                , imagePost("2018/08/14", "Bot Tests Human",
                #1101366, "30%",
                p("It's only fair that they test us first.")
                + p("(Yeah it's a joke post.) Next up: The other way around!"),
                left := true)
                
                , textPost("2018/08/13", "The Levels Of AI",
                p(b("Level 1: Literal.") + " Just make some responses. How are you? => I'm good/I have some problems")
                + p(b("Level 2: Battle it out.") + " Take the rules of level 1 and have them compete against each other. (There are also meta-rules.)")
                + p(b("Level 3: Fact management.") + " Some things are true, others aren't. Manage this.")
                + p("That's pretty much it. Now we just need a lot of rules to work with. Oh, and there's a very good parser for German &amp; English.")
                + p(targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/events/253736347/", "Meeting.")))
                
                , imagePost("2018/08/10", "How much",
                #1101365, "40%",
                p("...is an AGI? 'cause we deliver."))
                
                , imagePost("2018/08/09", "Learning from longer exchanges",
                #1101364, "50%",
                p("Getting somewhere.")
                + p("If you could talk to an AI about any topic&mdash;which one would you choose?"))
                
                , imagePost("2018/08/07", "Politics",
                #1101363, "50%",
                p("Bot knows (sadly)."),
                left := true)
                
                , imagePost("2018/08/05", "Bot decides",
                #1101362, "45%",
                p("Who knows what it will do next?"))
                
                , textPost("2018/08/04", "Let's improve the onboarding",
                p(targetBlank("http://t.me/Hello_Computer", "Channel") + "'s waiting dudes."))
                
                , imagePost("2018/08/02", "How the AI is programmed",
                #1101361, "30%",
                
p([[<b>v1 - Make a basic logic using a bastard language</b> located somewhere
     between Prolog and plain English (mostly it's just the latter).]])

                  + pre_trim([[
input(I'm a scammer!)
  && fact(a scammer scams people)
  && relationX(scams people, scam people)
  => output(You scam people?!)
]]) +

p([[<b>v2 - Add some $ signs and turn spaces into underscores</b>
     (making the pattern dynamic).]]) + pre_trim([[

input(I'm a $scammer!)
  && fact(a $scammer $scams_people)
  && relationX($scams_people, $scam_people)
  => output(You $scam_people?!)
]])            + p([[<b>v3 - Find out what relationX is</b> (that's not that hard).]])

               + p_b([[v4 - Interpret this stuff.]])

               + pre([[DONE]])
               
               + p([[Estimated time frame: ]] + b([[2 days]]))
               
               + p("Edit (2018/08/03): And it's done (see picture)."))
                
                , textPost("2018/08/02", "I'm beating them",
                p("IBM and all the other guys.")
                
              + p("My fabulous " + targetBlank("http://code.botcompany.de/1017686", "English Parser") + " just got better, you can now help it out by using some brackets, like this:")
                
                +pre("{This time of night} it's usually quite cool."))
                
                , textPost("2018/07/31", "I still contribute to StackOverflow",
                p("...even though " + targetBlank("https://stackoverflow.com/a/51618656/947488", "that place") + " is the living hell for any sane person. I'm not even allowed to ask questions anymore because <i>they hate dissidents</i>."))
                
                , imagePost("2018/07/31", "Bot Initiative",
                #1101360, "45%",
                p("Shurely an important part."))
 
                , imagePost("2018/07/28", "Bot needs more logic!",
                #1101359, "45%",
                p("We're getting there though."),
                left := true)

                /*, textPost("2018/07/27", "What is AI?",
                p("AI is " + i("puzzling stuff out") + ".")
                + p("(You know which meaning of \"puzzling\" is intended here, right? If yes: Then you're a " + i("good puzzler") + ".)")
                + p("So that's what we build: a " + i("puzzling engine") + "."))*/
                
                , imagePost("2018/07/27", "Telegram shaping up",
                #1101358, "45%",
                p(targetBlank("http://t.me/Hello_Computer", "Participate!")))

                , textPost("2018/07/27", "I should collect money for a new notebook",
                p([["What, you're doing AI with 4 gigabytes?"]])
                + p("Yes, that's right. And 512 MB actually go to the GPU, so yeah... it's tight."))
                
                , textPost("2018/07/26", "The Simplifier",
                p("Another working AI component. Takes any sentence or phrase, like:")
                + pre("smart combinations of various fast methods")
                + p("and outputs:")
+ pre(trim([[
1. combinations
2. combinations of methods
3. smart combinations
4. combinations of fast methods
5. smart combinations of methods
6. combinations of various methods
7. smart combinations of fast methods
8. combinations of various fast methods
9. smart combinations of various methods
10. smart combinations of various fast methods
]]))
                + p("Neat, right? And very useful."))
                
                , textPost("2018/07/22", "Setting Up Telegram",
                p([[There'll be ]] + targetBlank("http://t.me/Hello_Computer", "a channel") + [[ and a bot.]]))
                
                
                , textPost("2018/07/22", "The implications of this project",
                p([[I'm not sure if you have thought this through yet. This is a project that <i>makes computers think</i>.]]))
                
                , imagePost("2018/07/20", "A few more steps",
                #1101357, "45%",
                p([[...and you'll have the dialog engine you're all waiting for.]]))

                /*, textPost("2018/07/22", "The StackOverflow War",
                p("StackOverflow is completely intolerable if you try to actually work on it. The trolls are in charge there.")
                + p("There is a " + targetBlank("https://meta.stackexchange.com/questions/187661/mirrors-of-stack-overflow", "legal way") + " to mirror the site, so: Let's do it! I'm downloading the first archive as we speak. Huge stuff though, gigabytes over gigabytes..."))*/
                
                , textPost("2018/07/18", "English+German Parsers Work",
                  p("Input:")
                + pre("\"Confessions of a Burglar Video\"")
                + p("(It's the name of a video on YouTube.) So... is the video confessing&mdash;or the burglar? Let's ask the parser.")
                + pre(rtrim([[
1. Confessions {of {a {Burglar Video}}}
2. {Confessions {of {a Burglar}}} Video
                ]]))
                + p("Yup, it has found the 2 grammatical possibilities. Next up: Semantic analysis to rate these against each other."))
                
                , textPost("2018/07/18", "500 installations coming up",
                p([[We're reaching a nice number of JavaX-enabled computers. And no, they're not all mine.]]))

                , imagePost("2018/07/12", "Perfect Parser Coming Up",
                #1101356, "45%",
                p([[English&mdash;no problem.]]))

                , imagePost("2018/07/12", "The Magic OS",
                #1101353, "45%",
                p([[In my OS, every computer can control any other one&mdash;if the "victim" deliberately chooses this (it's a separate module you have to load explicitly, so don't worry).]])
                + p("The communication process behind this is protected using automatic cryptographic signatures."))

                , imagePost("2018/07/10", "Teaching Puns To The AI...",
                #1101352, "45%",
                
                p("52 days to world domination."))
                
                , textPost("2018/07/10", "News from Zuckerberg",
                p(youtubi("_zCDvOsdL9Q", 400)))

                , textPost("2018/07/07", "56 days",
                p("until Stefan's OS takes the world."))
                
                /*, imagePost("2018/07/05", "News From Israel",
                #1101349, "30%",
                p(targetBlank("https://www.aljazeera.com/indepth/inpictures/israeli-forces-assault-palestinians-prepare-demolish-village-180704141245982.html", "Great country.")),
                picLink := "https://www.aljazeera.com/indepth/inpictures/israeli-forces-assault-palestinians-prepare-demolish-village-180704141245982.html")*/
                
                , imagePost("2018/07/02", "Dead Lock-Immune Operating System",
                #1101348, "30%", p(targetBlank("http://code.botcompany.de/1016805", "Code.")), left := true)

                /*, textPost("2018/07/02", "Dear Kirill from the Android team,",
                
hParagraphsFromEmptyLines([[I have to get these things off my chest.

    1. I used to work at Google. I quit in 2009 because they wanted to waste me.

    2. I make an operating system in Java that is ALL THAT ANDROID SHOULD HAVE BEEN.

    3. I tried to install WhatsApp on a friend's Android phone yesterday and IT SIMPLY DID NOT WORK.

3b. I got kicked off the Play Store because I dynamically load code from un-servers (non-Google-servers). So it's a fight? Guess who'll win.

    4. In my Java OS, ALL MODULES RUN IN ONE VM AND IT'S NOT A PROBLEM.

4b. No, the Java process does not get "wonky" over time as misinformed programmers baselessly claim. They just have more deadlocks than I do (my deadlocks are <a target="_blank" href="http://code.botcompany.de/1016805">fixed by the OS</a>).

    5. I have an idea for a better Swing PLAF interface. Just two components: a painter and a "clicker" (event handler). Easy & really transparent.

    6. My OS has <b>orthogonal persistence</b> which is... slightly easier than your persistence approach.

Cheers.

Stefan]]))*/
                
                /*, textPost("2018/06/30", "Something must be wrong with reality",
                  p("The movies we watch have a better plot than the life we actually live. How is that possible?"))*/
                  
                , textPost("2018/06/30", "We're doing it again",
                  invtag('div, style := "float: right; margin-left: 20px; margin-bottom: 20px",
                    youtubi("lAkuJXGldrM", 300))
                  + p("Stefan's OS has a greater impact than Windows 95. You just wait and see!"))
                
                , textPost("2018/06/27", "Computer checks its own voice",
                  p(youtubi("ZRkGdIvW5lM", 600)))

                , imagePost("2018/06/23", "Stefan's OS v5",
                   #1101335, "30%",
                   p("See who else is online, world wide (if you load the module).")
                 + p([[Also notice the "AI bar" at the top which is a novel invention.]]))
                   
                , textPost("2018/06/23", "We are solving the software security crisis",
                p("The solution is "+ b("source code inspection") + ", and " + ahref("http://javax.botcompany.de", b("JavaX")) + " makes it practical."))
                
                , textPost("2018/06/23", "We will now do the Super-Automation",
                   p("The operating system is the optimal place to automate everything&mdash;it sees everything and it can act upon information. Also loading and even making dynamic code on the fly is trivial in my OS."))
                   
                , textPost("2018/06/25", "If your language isn't perfect&mdash;how about changing it?",
                p("Let's say " + b("vanilla Java is too verbose") + ". (Everybody knows this.) Instead of this:")
                + pre("class ShowBackgroundImage extends DynModule {")
                + p("I want to type (and see) only this:")
                + pre("class ShowBackgroundImage &gt; DynModule {")
                + p(b("In JavaX") + ", that takes " + b("exactly one line") + " in the " + targetBlank("http://code.botcompany.de/759", b("translator")) + ":")
                + pre(htmlencode([[jreplace(tok, "class <id> > <id> {", "class $2 extends $4 {");]]))
                + p("And this easily, my language has been extended.")
                + p(b(targetBlank("http://code.botcompany.de/1016607", "Proof that this works."))))

                , textPost("2018/06/20", "Collaboration!",
                    p(targetBlank("http://www.ort-des-talents.de/", "BrainCircle.")))
                
                , textPost("2018/06/20", "Stefan's OS v4",
                    p(ahref("https://stefans-os.botcompany.de", "Numerous small improvements") + ". Finds memory leaks automatically (!). Ability to make \"alternative brains\" (multiple distinct instances of OS on a machine). Still compatible with Windows, Linux and Mac."))
                
                , imagePost("2018/06/19", "Reading my mails",
                  #1101332, "30%",
                  p("Not pretty (where are the graphic designers?), but it works.")
                  + p(ahref("http://code.botcompany.de/1016066", "Source code") + " (39 lines)")
                  , left := true)
                
                , imagePost("2018/06/18", "First operating system that learns",
                  #1101331, "30%",
                  p(b([[What is the world?]])), left := false)
                
                , imagePost("2018/06/18", "Advantages of a Java-based OS: Free Profiling",
                  #1101328, "30%",
                  p([[You get so many <b>inspection capabilities</b> for free in my OS.]])
                  + p([[For example, you can always find out what the CPU  is doing, down to every single line of code. And this incurs no performance overhead when not used.]]), left := true)
                
                , textPost("2018/06/17", "Memory leak eliminated", p("Gotcha.") + p("I told you Java is stable!"))
                
                , imagePost("2018/06/16", "Further chasing the memory",
                  #1101327, "30%",
                  p([[It has to be going somewhere. ]] + ahref("http://mail.openjdk.java.net/pipermail/discuss/2018-June/thread.html", "jdk-discuss") + [[ informed (list is moderated, read: another time waster).]]), left := true)
                
                , imagePost("2018/06/16", "New Look&amp;Feel",
                  #1016391, "30%",
                  p([[Pretty, isn't it. Look&amp;Feel is called ]] + ahref("http://jtattoo.net", "JTattoo") + [[.]]) + p([[Image was made with the automatic screenshot module on a very old Windows 7 machine where my OS runs flawlessly.]]), left := true)
                
                , textPost("2018/06/15", "Fixing the last memory leaks in Java 10", [[
                <p>I submitted this <a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8204963">bug report</a> to Oracle, and I'm making
                super-fancy functions like <a href="http://code.botcompany.de/1016334">cleanDefunctACCsInAllThreads</a> that automatically fix
                memory leaks other Java programmers have never heard of.</p>
                <p>We will sail memory leak-free! :)</p>
                ]]) + [[

                <!-- A single blog post -->
                <section class="post">
                    <header class="post-header">
                        <img width="48" height="48" title="Stefan Reich's avatar" class="post-avatar" src="]] + snippetImgLink(#1101324) + [[">

                        <h2 class="post-title">New Module: YouTube Downloader</h2>

                        <p class="post-meta">
                            By <a href="mailto:info@botcompany.de" class="post-author">Stefan Reich</a> @ 2018/06/14
                        </p>
                    </header>
                    
                    <div class="post-description" style="clear: both">
                        <div style="float: right; width: 50%">
                            <a href="https://botcompany.de/1004590/raw/1101311">
                                <img title=""
                                     class="pure-img-responsive"
                                     src="https://botcompany.de/1004590/raw/1101311" style="width: 100%">
                            </a>
                        </div>
                            
                        <p>
                            Today we launched <b>bla bla bla</b>.
                        </p>
                        <p>&nbsp;</p>
                        <p>(No, seriously&mdash;we actually did. There is an awesome YouTube downloader in my <a href="http://exe.tinybrain.de/">operating system</a>. I'm just too lazy to write.)</p>
                        <p>Now I need an awesome screenshot module and an awesome auto-upload-to-blog module.</p>
                    </div>
                </section>
  ]]); // end of posts
  
  if (nempty(date))
    allPosts = dropFirst(allPosts, indexOfFirstThat(allPosts,
      post -> cmp(regexpFirstMatch("20\\d\\d/\\d\\d?/\\d\\d?", post), date) <= 0));
  
  LS posts = subList(allPosts, (page-1)*perPage, page*perPage);
  bool hasPrev = page > 1, hasNext = l(allPosts) > page*perPage;
  
  S nav = !hasNext && !hasPrev ? "" 
    : hsection(joinNempties(" | ", 
      hasPrev ? ahref(rawSelfLink(str(page-1)), "Last page") : "",
      ahref("http://javax.botcompany.de/1020398/raw/contact", "Imprint"),
      hasNext ? ahref(rawSelfLink(str(page+1)), "Next page") : ""),
    class := "post", style := "text-align: right");
    
  // template starts here
  S html = [[
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>BotCompany.de</title>
    
    <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" crossorigin="anonymous">
    
    <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/grids-responsive-min.css">
    <link rel="stylesheet" href="css/layouts/blog.css">
]] // BROKEN (deploys.io out of service): + html_nextGenBots_discordWidget()
+ [[
</head>
<body>

]] + [[<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js?tracking=1&always=1"></script>]] + [[

<div id="layout" class="pure-g">
    <div class="sidebar pure-u-1 pure-u-md-1-4">
        <div class="header">
            <h1 class="brand-title"><a href="https://www.BotCompany.de">]] +
          himgsnippet(#1102944, width := "300", title := "BotCompany [logo by sadietwiqs]", alt := "BotCompany [logo by sadietwiqs]")
            //[[Bot]] + html_invisibleSpace() + [[Company]]
            + [[</a></h1>
            <h2 class="brand-tagline">English &amp; German Chat Bots</h2>

            <nav class="nav">
                ]] + tag('ul,
                    li(a("SERVICES", class := "pure-button", href := "https://botcompany.de/?date=2019%2F11%2F26"), class := "nav-item")
                + " " +
                    li(a("JAVAX", class := "pure-button", href := "http://javax.botcompany.de"), class := "nav-item")
                + " " +
                  /*li(a("GERMAN DEMO BOT", class := "pure-button", href := "http://www.web-woody-lab.de/", target := "_blank"), class := "nav-item")
                + " " +
                    li(a("DISCORD GROUP", class := "pure-button", href := "https://discord.gg/T5Sg5ZA", target := "_blank"), class := "nav-item")*/

/*                + " " +
                   li(a("Download Windows", class := "pure-button", href := osInstallerLink()), class := "nav-item")
                + " " +
                   + li(a("Download Mac/Linux", title := "Install Java first (from java.com)", class := "pure-button", href := "https://www.botcompany.de/files/1400169/Stefans%20OS.jar"), class := "nav-item")*/
                   
                /*+ " " +
                  li(a("agi.blue", class := "pure-button", href := "https://agi.blue/"), class := "nav-item")*/
            
                  + " " +
                  li(a("Twitch", class := "pure-button", href := "https://twitch.tv/stefanreich"), class := "nav-item")
                  
                  + " " +
                      li(a("Videos", class := "pure-button", href := "https://www.youtube.com/channel/UCSvK6EfxnMTajbe-Qpc6NvA/videos"), class := "nav-item")
                    //, class := "nav-list")
                  + " " +
                      li(a("Meetings", class := "pure-button", target := "_blank", href := "https://www.meetup.com/Artificial-Intelligence-Meetup/"), class := "nav-item")
                  + " " +
                      li(a("Slides", class := "pure-button", target := "_blank", href := "https://slides.com/stefanreich"), class := "nav-item")
                  + " " +
                      li(a("GBot", class := "pure-button", target := "_blank", href := "https://discordbots.org/bot/602481480266153984"), class := "nav-item")
                    , class := "nav-list")
                + [[
            </nav>
            
            <p>&nbsp;</p>
            <p><a style="text-decoration: none; color: white" href="https://stefans-os.botcompany.de"><b>Stefan's OS</b></a><br> is an inspiring Java program you can <a style="text-decoration: underline; color: white" href="https://stefans-os.botcompany.de">try out</a> in Windows, Mac OS or Linux.</p>
            
        </div>
    </div>

    <div class="content pure-u-1 pure-u-md-3-4">
        <div>
            <div class="posts">
                <!--<h1 class="content-subhead">Recent News</h1>-->
                ]]
                
                + hcss(autoUnindent([[
                  pre { margin-left: 20px; }
                  tt, pre { font-weight: bold; }
                ]]))
                + nav
                  
                + lines(posts)
                
                + nav

                + [[
                
            </div>

            <div class="footer">
                <div class="pure-menu pure-menu-horizontal">
                    <ul>
                        <li class="pure-menu-item" id="visitors"></li>
                        <li class="pure-menu-item"><a href="https://stefans-os.botcompany.de" class="pure-menu-link">More</a></li>
                        <li class="pure-menu-item"><a href="https://www.youtube.com/channel/UCSvK6EfxnMTajbe-Qpc6NvA/videos" class="pure-menu-link">YouTube</a></li>
                        <li class="pure-menu-item"><a href="http://javax.botcompany.de/1020398/raw/contact" class="pure-menu-link">Impressum</a></li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>

</body>
</html>
]];

  if (nempty(date)) {
    S title = contentsOfFirstContainerTagWithParams(first(allPosts), 'h2, class := "post-title");
    if (nempty(title))
      html = hreplaceTitle(html, title);
    else
      print("Warning: No blog entry title found for date " + date);
  }
    
  ret
    html.replace("\"css/layouts/blog.css\"", htmlQuote(rawSnippetURL(#1016322, "text/css")))
    .replaceFirst(regexpQuote("<body>"), "<body>" + hSilentComputatorWithFlag("homepage"))
    
    // add stuff before closing body tag
    .replaceFirst(regexpCaseInsensitivePrefix() + "</body>",
      /*loadJQuery() +
      hjavascript_src("https://botcompany.de/1026215/raw") + "</body>"*/
      // scribble doesn't use the right background color yet, and it's not clickable
      /*hjs_includeScribble() + */
      "</body>");
} // end of html()

sS textPost(S date, S title, S text) {
  ret invtag('section, class := "post", style := "clear: both",
    invtag('header, class := "post-header",
      invtag('img, width := 48, height := 48,
        title := "Stefan Reich",
        class := "post-avatar",
        src := snippetImgLink(#1101324))
      + [[
      <h2 class="post-title">]] + title + [[</h2>

                        <p class="post-meta">
                            By <a href="mailto:info@botcompany.de" class="post-author">Stefan Reich</a> @ ]] + ahref(hquery(+date), date) + [[
                        </p>
]]) + [[
                    <div class="post-description">
                    ]] + text + [[
                    </div>]]);
}

sS imagePost(S date, S title, S imageID, S width, S text, O... _) {
  optPar bool left;
  optPar bool imageTargetBlank;
  optPar S picLink;
  ret textPost(date, title, 
    invtag('div, style := "float: " + (left ? "left" : "right") + "; width: " + width + "; margin-bottom: 30px; margin-" + (left ? "right" : "left") + ": 30px;", ahref(or2(picLink, snippetImageLink(imageID)),
    invTag img(title := "",
      class := "pure-img-responsive",
      src := snippetImageLink(imageID),
      style := "width: 100%"), target := imageTargetBlank ? "target" : null))
  + text);
}

sS youtubi(S url) {
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url);
}

sS youtubi(S url, int width) {
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url, width);
}

sS youtubi(S url, int width, int height) {
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url, width, height);
}

sO domainAndURISwitch(S uri, SS params) {
  S domain = domain();
  print("BLOG BOT domain: " + domain + ", uri: " + uri);
  
  S _uri = uri;
  uri = addSlashPrefix(uri);
  
  if (pkiValidation && startsWith(uri, "/.well-known/"))
    ret subBot_serveText(loadTextFile(userDir("validation.txt")));
    
  if (eqic(domain, "code.botcompany.de")) {
    long snippetID = parseLong(dropSlashPrefix(uri));
    ret hrefresh(snippetID == 0
      ? tb_mainServer_pretty() + "/tb/snippets.php"
      : tb_mainServer_pretty() + "/tb/show-snippet.php?id=" + snippetID);
  }
  
  if (swic(domain, "javax.")) {
    pcall {
      O result = callHtmlMethod2(getBot(#1020398), uri, params);
      print("Result: " + className(result));
      ret result;
    }
  }
  
  if (eqic(domain, "create.botcompany.de"))
    ret hrefresh(tb_mainServer_pretty() + "/tb/snippets.php?action=create");
  
  if (eqic(domain, "recognizer.botcompany.de"))
    ret subBot_serveRedirect("https://botcompany.de/files/1400260/chess-board-recognizer-0.2.jar");
    
  if (eqic(domain, "discord-fan.botcompany.de"))
    ret subBot_serveRedirect("https://botcompany.de/files/1400274/Discord-Fan.jar");
    
  if (domainIsUnder(domain, "stefans-os.botcompany.de")
    || domainIsUnder(domain, "stefans-os.site"))
    ret serveStefansOSSite(uri, params);
    
  if (domainIsUnder(domain, "zttnn.me"))
    ret serveZTTNN();
    
  if (domainIsUnder(domain, "tomii.me"))
    ret serveTomiiMe(uri);
    
  if (domainIsUnder(domain, "phrasecache.best"))
    ret hhtml(hhead_title("PhraseCache - Best NLP System")
      + hbody(hsansserif() + hfullcenter(
      p(himagesnippet(#1102923, title := "PhraseCache")) +
      p("by " + ahref("https://botcompany.de", "BotCompany")) +
      h3("PhraseCache is a simple language for matching natural language inputs.") +
      p(joinWithBR(
        ahref("http://code.botcompany.de/1028073", "Latest matching function"),
        ahref("http://code.botcompany.de/1028083", "Latest scored matching function"),
        ahref(tb_mainServer_pretty() + "/getraw.php?id=1030319", "Current docs"),
        ahref("https://tomii.me/nlp patterns.html", "Docs for older version") + " (latest version is backwards-compatible)")
      ))));
    
  if (eqicOneOf(domain, "jumpcut.botcompany.de", "ajc.botcompany.de"))
    ret subBot_serveRedirect("https://botcompany.de/files/1400263/AutoJumpCut-Installer-0.6-win32.exe");
  
  if (isAGIBlueDomain(domain)) {
    if (eq(uri, "/"))
      ret htitle("AGI.blue is now Gazelle.rocks") + hrefresh(5.0, "https://gazelle.rocks")
        + hmobilefix() + hsansserif() + hNoBlueLinks() + hfullcenter("You will be redirected to our latest AGI project: " + b(ahref("https://gazelle.rocks", "GAZELLE"))
         + repString(3, "<br>") + small(ahref("https://agi.blue/old", "See the old agi.blue system")));
        
    if (eq(uri, "/old")) uri = "/";
    ret eleu_serveSubBot(#1023558, uri, params);
  }
    
  if (ewic(domain, "abots.space"))
    ret eleu_serveSubBot(#1026318, uri, params);
    
  if (swic(domain, "mech."))
    ret hrefresh("https://botcompany.de/1013927/raw");
    
  // add more domains here
    
  // URI switches
  
  new Matches m;
  uri = addSlash(uri);
  if (swic(uri, "/mmozumder/", m))
    ret callHtmlMethod2(getBot(#1026011), "/" + m.rest(), params);
  if (swic(uri, "/smart-iptv-solutions/", m))
    ret callHtmlMethod2(getBot(#1026223), "/" + m.rest(), params);
  if (swic(uri, "/tomii-boi/admin/", m))
    ret callHtmlMethod2(getBot(#1026409), "/" + m.rest(), params);
  if (swic(uri, "/hypercubes/admin/", m))
    ret callHtmlMethod2(getBot(#1026544), "/" + m.rest(), params);
  if (swic(uri, "/smart-home/admin/", m))
    ret callHtmlMethod2(getBot(#1026867), "/" + m.rest(), params);
  if (swic(uri, "/contractbox/admin/", m))
    ret callHtmlMethod2(getBot(#1028281), "/" + m.rest(), params);
  if (swic(uri, "/ada/admin/", m))
    ret callHtmlMethod2(getBot(#1028301), "/" + m.rest(), params);
  if (swic(uri, "/exodontia/admin/", m))
    ret callHtmlMethod2(getBot(#1028921), "/" + m.rest(), params);
  if (swic(uri, "/cspillai/admin/", m))
    ret hrefresh("https://cspillai.botcompany.de");
  if (swic(uri, "/fiverr/"))
    ret hrefresh("https://www.fiverr.com/stefan_reich/create-a-chat -bot-for-your-website-or-chat-platform");
  if (swic(uri, "/bookbetternow/admin/", m))
    ret callHtmlMethod2(getBot(#1028421), "/" + m.rest(), params);
  if (swic(uri, "/infinici/admin/", m))
    ret callHtmlMethod2(getBot(#1029306), "/" + m.rest(), params);
    
  if (swic(uri, "/newdesign/", m))
    ret new HttpFromFileSystem(javaxDataDir("newdesign")).serve(m.rest());
    
  if (swic(_uri, "/ace-builds/")) try {
    ret subBot_maxCacheHeaders(serveWithMimeType(loadPage(tb_mainServer_pretty() + _uri), "text/javascript"));
    
  } catch print e {
    ret serve404();
  }
   
  if (eqic(_uri, "/x30.jar"))
    ret subBot_serveFile(pathToJavaxJar());
  
  // add more URI switches here
  null;
}

sO serveStefansOSSite(S uri, SS params) {
  try object redirectToHTTPS(uri, params);
  ret hhtml(hhead_title("Stefan's OS Download")
    + hbody(hfullcenter(
      h1("Stefan's OS") +
      p(b(ahref(osInstallerLink(), "WINDOWS INSTALLER", style := "font-size: 1.25em")) + "<br>" + " (120 MB) which includes everything you need (including Java).") +
      p("Mac or Linux users and other weirdos: " + ahref("https://botcompany.de/files/1400497/Stefans-OS.zip", "Download JAR, 3.3 MB")) +
      p("(For the jar file you may need to install " + targetBlank("https://adoptopenjdk.net/", "OpenJDK 8") + " or later - JDK 16 is perfect)") +
      p("by " + targetBlank("https://BotCompany.de", "BotCompany")) +
      p("Stefan's OS is open source software. Sources here: "
        + ahref("https://code.botcompany.de/1024932", "[OS]") + " "
        + ahref("https://code.botcompany.de/1001639", "[JavaX]"))
      )));
}

sS serveZTTNN() {
  ret hhtml(hhead_title("Zero Training Time Neural Networks")
    + hbody(hfullcenter(
      h1("Zero Training Time Neural Networks") +
      p(himageSnippet(#1102921)) +
      p([[A classifier trained with a few simple labels]]))));
}

sO serveTomiiMe(S uri) {
  S tomiiVersion = #1400377;
  File dir = programFile("tomii.me");
  File versionFile = newFile(dir, "version.txt");
  if (!eq(loadTextFile(versionFile), tomiiVersion)) {
    saveTextFile(versionFile, tomiiVersion);
    print("Updating Tomii to " + tomiiVersion);
    unzipSnippet(tomiiVersion, dir);
  }
  if (eq(uri, "/")) uri = "/index.html";
  ret new HttpFromFileSystem(dir).serve(uri);
}

sS osInstallerLink() {
  ret "https://botcompany.de/files/1400496/Install-Stefans-OS-2021-Jun-20.exe";
}

download  show line numbers  debug dex  old transpilations   

Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv

No comments. add comment

Snippet ID: #1016323
Snippet name: Blog Bot [DOMAIN BOT]
Eternal ID of this version: #1016323/1132
Text MD5: 25d713cdb974a29374dfa827f78eb723
Transpilation MD5: 48126355e1de3d39e5026fcccdc8f8c1
Author: stefan
Category: javax / html
Type: JavaX module (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2023-02-20 20:05:03
Source code size: 93835 bytes / 1949 lines
Pitched / IR pitched: No / No
Views / Downloads: 15508 / 61515
Version history: 1131 change(s)
Referenced in: [show references]