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).

1  
!7
2  
3  
!include once #1028763 // helper for HttpFromFileSystem
4  
set flag NoNanoHTTPD.
5  
6  
static new ThreadLocal<Bool> youtubeOff;
7  
8  
static int perPage = 20;
9  
sbool pkiValidation = true;
10  
11  
sS rawSelfLink(S uri) { ret "/blog" + addSlashPrefix(uri); }
12  
13  
html {
14  
  if (domain() == null) ret serveDelayed404();
15  
  
16  
  S vis = registerVisitor();
17  
  
18  
  try object domainAndURISwitch(uri, params);
19  
  
20  
  if (!eq(uri, "/") || !domainIsUnder(domain(), "botcompany.de")) {
21  
    print("404: " + domain() + " / " + uri);
22  
    ret serveDelayed404();
23  
  }
24  
  
25  
  try object redirectToHTTPS(uri, params);
26  
      
27  
  ret serveBlog(uri, params);
28  
}
29  
30  
sO redirectToHTTPS(S uri, SS params) null {
31  
  if (!subBot_isHttps_defaultToTrue())
32  
    ret subBot_serveRedirect("https://" + domain() + uri + htmlQuery(params));
33  
}
34  
35  
36  
sO serveBlog(S uri, SS params) {
37  
  tempSetThreadLocal(youtubeOff, eq("1", params.get('youtubeOff))
38  
    || eqOneOf(params.get('youtube), "0", "off", "no"));
39  
  O[] linkStyle = litobjectarray("style", "color: inherit; text-decoration: underline");
40  
  
41  
  S uri_orig = uri;
42  
  uri = dropPrefix("/", uri);
43  
  int page = startsWithDigit(uri) ? parseFirstInt(uri) : 1;
44  
  S date = params.get('date);
45  
  
46  
  LS allPosts = ll(
47  
    imagePost("2023/2/20", "The curve we are after",
48  
      #1103203, "50%",
49  
      
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.") +
51  
      
52  
      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.") +
53  
      
54  
      p("Crypto, man... either it breaks you " + b("or it makes you") + "."),
55  
      
56  
      left := true),
57  
      
58  
    /*textPost("2022/5/31", "May 2022: I doubled my investment in 2.2 days",
59  
    
60  
    p(targetBlank("https://agi.topicbox.com/groups/agi/Tddc937591514587e", "Details here."))),*/
61  
    
62  
    imagePost("2022/1/12", "Gazelle 22", #1103059, "50%",
63  
    
64  
    p(ahref("https://gaz.ai", "New flagship product") + " in the making. This is a product of a category that didn't exist before.
65  
      Team reassembled. Looking for investors right now.")),
66  
67  
    textPost("2022/1/12", "Vaccines mandates averted?",
68  
    
69  
    p("Threat gone. I believe.
70  
      Spiritual realities manifest before physical realities, so
71  
      the information may take a while to arrive in your reality.")),
72  
    
73  
    imagePost("2021/11/21", "Everything will change", #1103049, "30%",
74  
    
75  
      p(ahref("https://www.bitchute.com/video/GHiQTVZqE6Pt/", "There are only 2 groups now."))),
76  
      
77  
    imagePost("2021/9/10", "Image recognition news", #1103002, "30%",
78  
      mapToLines p(
79  
        targetBlank("https://agi.topicbox.com/groups/agi/T8ca0db34fc106b16/image-recognizers-should-return-mathematical-proofs", "Image recognizers should return mathematical proofs"),
80  
            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")
81  
      )
82  
    ),
83  
    
84  
    textPost("2021/8/10", "Getting back into image recognition",
85  
    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.") +
86  
    
87  
    p("Also, a new investment from " + targetBlank("https://adaptroninc.com", "Adaptron Inc") + ". Thanks so much!") +
88  
    
89  
    p("Also, getting back into " + targetBlank("https://www.youtube.com/watch?v=bi2BIInFjR4", "streaming") + ".") +
90  
    
91  
    p("Also, crowdfunding in preparation. " + targetBlank("https://gazelle.rocks/checkout", "Reserve your AI now already!"))),
92  
    
93  
    textPost("2021/6/11", "Work with the Mega Team&trade; continues",
94  
      p(targetBlank("https://bea.gazelle.rocks/124479", "mega team") + " International Collab.")),
95  
96  
    textPost("2021/6/11", "I presented Gazelle at a conference of the smartest people on earth",
97  
    
98  
    p(youtubi("LUCnzQyCUhU"))),
99  
100  
        textPost("2021/5/16", "A cooperation with Adaptron Inc. of Canada!",
101  
    
102  
      p([[I am porting their demo application ]] + targetBlank("http://www.adaptroninc.com/BasicPage/smarty-software", "Smarty") + [[ to Java.]]) +
103  
      p([[On the way, I am
104  
      learning about ]] + targetBlank("http://www.adaptroninc.com/BookPage/research-architecture-and-design", "binons") + [[ which are an interesting alternative
105  
      to classical artificial neurons. For example, binons only
106  
      come to existence when there is a need for them as opposed to
107  
      being preallocated by a software engineer. Binons
108  
      automatically distinguish between significant and insignificant deltas. And they form hierarchies to reach higher abstraction levels.]])),
109  
      
110  
    textPost("2021/4/30", "New Live Stream",
111  
      p("It explains the AGI ideas pretty well.")
112  
      
113  
      + p(youtubi("M66H1S90NLU"))),
114  
      
115  
    textPost("2021/4/11", "Gazelle AGI Technical Pitch",
116  
      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."))),
117  
      
118  
    textPost("2021/4/4", "AGI pattern matching",
119  
      p(targetBlank("https://bea.gazelle.rocks/query?q=a+lot+of+sanitizer+keeps+covid+away&algorithm=Process+new+input", "First steps"))),
120  
      
121  
    /*textPost("2021/3/4", "Legal LSD microdoses",
122  
      p(targetBlank("https://lsd-service.net", "Here."))),*/
123  
      
124  
    textPost("2021/3/4", "Voice chat about AGI with Mani",
125  
      p(youtubi("eafdxmnsPOo"))),
126  
    
127  
    textPost("2021/1/8", "Joining Pays5.com",
128  
    p(targetBlank("https://pays5.com", "New crowdfunding platform!") + " I'm now CTO there.") +
129  
    
130  
    p("Also, more image recognition.") +
131  
    
132  
    p(youtubi("3VToiitnzd4"))),
133  
    
134  
    textPost("2020/12/10", "Work on Gazelle resumes",
135  
    
136  
    p(youtubi("W-NPUlIf2cU"))),
137  
    
138  
    textPost("2020/11/25", "Gazelle.rocks launched",
139  
    
140  
    p(targetBlank("https://gazelle.rocks", "It works.")
141  
      + " Now need content.")
142  
      + youtubi("wC68dU5iTe0")),
143  
    
144  
    textPost("2020/10/15", "Gazelle AI probable launch date: Middle/End of November",
145  
    
146  
    p("Hopefully. Recruiting for team. " + targetBlank("https://gazelle.rocks", "gazelle.rocks") + ".")),
147  
    
148  
    textPost("2020/09/05", "Streaming on Twitch daily now (maybe... or maybe not)",
149  
    p(targetBlank("https://twitch.tv/stefanreich", "Code them bots"))),
150  
    
151  
    textPost("2020/08/16", "Wikify.live&mdash;fastest Wikipedia search engine",
152  
    
153  
    p(ahref("https://wikify.live/search/yesterday,+all+my", "Try it!"))),
154  
    
155  
    textPost("2020/08/07", "Towards like the fastest search engine ever",
156  
    
157  
    p(youtubi("7hshUUs_ptw"))),
158  
  
159  
    textPost("2020/07/28", "Suffix tree + compression = magic?",
160  
    
161  
    p(youtubi("GZ_UDLh8MRc")) +
162  
    p("We'll find out")),
163  
  
164  
    imagePost("2020/07/28", "Indexing Wikipedia",
165  
    #1102945, "25%",
166  
    
167  
    p("for the fastest search engine ever")),
168  
    
169  
    textPost("2020/07/22", "A software that laughs at my jokes",
170  
    
171  
    p(youtubi("VLWigKUAJDU")) +
172  
    p("Humanization in progress!")),
173  
    
174  
    textPost("2020/07/21", "The hunt for the sub 1 millisecond search engine",
175  
    
176  
    p(youtubi("GgmXoZQ-VUo")) +
177  
    p("I'm in hot pursuit. A full-text searcher that reacts in a millisecond even with large texts.")),
178  
    
179  
    textPost("2020/07/17", "Server problems today [solved]",
180  
    
181  
    p("Hoster has a V-server overload... Should be getting fixed today. And we will move to more dedicated hardware soon.")
182  
    
183  
    + p("Edit: Looks like it's all solved again.")),
184  
    
185  
    textPost("2020/07/15", "New video",
186  
    
187  
    p("It's been so long!") +
188  
    p(youtubi("LI2ow-l8mgI"))),
189  
    
190  
    imagePost("2020/07/11", "A booking chat bot that understands free-form date input",
191  
    #1102942, "50%",
192  
    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!"),
193  
    left := true, picLink := "https://bookbetternow.com/", imageTargetBlank := true),
194  
    
195  
    imagePost("2020/07/06", "Comparing scenarios",
196  
    #1102940, "65%",
197  
    p("Important AI function")),
198  
    
199  
    imagePost("2020/07/06", "Chat bot launched",
200  
    #1102941, "30%",
201  
    p(targetBlank("https://contractbox.co", "contractbox.co") + " writes your Word documents for you!"),
202  
    left := true, picLink := "https://contractbox.co", imageTargetBlank := true),
203  
    
204  
    imagePost("2020/07/06", "Syntactic Learning",
205  
    #1102939, "30%",
206  
    p("Still using no neural networks.")),
207  
    
208  
    textPost("2020/06/02", [[The 3 principles of "Natural Language Assembly"]],
209  
    p("A lower-level language that helps bridge the gap between natural language and computers.") +
210  
    
211  
    p(youtubi("Ltk275Gn8eA"))),
212  
    
213  
    textPost("2020/05/27", "LINECOMP&mdash;a compressor that sometimes beats 7-zip",
214  
    
215  
    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.") +
216  
    
217  
    p(ahref("https://botcompany.de/files/1400390/linecomp-0.3.jar", "Download.") + " " +
218  
      targetBlank("https://agi.topicbox.com/groups/agi/Tb2cf064c700f181c/i-made-a-multi-file-compressor-that-beats-7zip-on-real-world-data", "Info & discussion."))),
219  
    
220  
    imagePost("2020/05/10", "Tomii Boi: Best Q&A Bot for Discord",
221  
    #1102922, "30%",
222  
    
223  
    p(ahref("https://tomii.me", "Click here for more info")),
224  
      picLink := "https://tomii.me"),
225  
    
226  
    textPost("2020/05/02", "NLP-based shopping list",
227  
    
228  
    p(youtubi("fVJcIm7zAGQ"))),
229  
    
230  
    imagePost("2020/03/31", "Cruddie, your personal chat bot",
231  
    #1102906, "15%",
232  
    
233  
    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.")
234  
    
235  
    + p(youtubi("gfWTPfGDlTU") + " " + youtubi("dUKYlJ2f9RQ")),
236  
    left := true),
237  
    
238  
    textPost("2020/03/18", "Speedrun continues, Pt. X",
239  
    
240  
    p(youtubi("XZfubRbbg58") + " " + youtubi("y5viJD0djCU"))),
241  
    
242  
    textPost("2020/03/15", "Fluid text files",
243  
    
244  
    p("A cool human- and computer-friendly text file format I have wanted for a long time. Now it's here!") +
245  
    
246  
    p(youtubi("fYQ603KTMM8"))),
247  
    
248  
    textPost("2020/03/06", "Speedrun continues",
249  
    
250  
    p([[Gathering AI scripts from the database by matching keywords.]]) +
251  
    
252  
    p([[Results & an answer to my skeptics at ]] + ahref("https://www.youtube.com/watch?v=baT5TqNSNqk&t=3520s", "58:40"))
253  
    
254  
    + p(youtubi("baT5TqNSNqk"))),
255  
256  
    textPost("2020/03/02", "Combining image recognition &amp; the logic engine, Pt. 1",
257  
    
258  
    p(youtubi("4L1sBLqUbNQ"))),
259  
    
260  
    textPost("2020/02/26", "Building an image recognition for Anki Vector, Pt. 1-3",
261  
    
262  
    p(youtubi("W-QE_XWmeVs") + " " + youtubi("9FMY3YUTqGM") + " " + youtubi("r6GB52sUl1o"))),
263  
    
264  
    imagePost("2020/02/25", "Solving the Winograd Challenge, Pt. 5",
265  
    #1102881, "50%",
266  
    
267  
    p("Look, a program is forming.") +
268  
    
269  
    p(targetBlank("https://agi.topicbox.com/groups/agi/T21bdc2c440c86db7/my-new-anki-vector-and-first-actual-winograd-challenge-solved", "Explanations & heated discussion."))
270  
    
271  
    + p(targetBlank("https://www.youtube.com/watch?v=Pb70CAx-I_o", "Video.")),
272  
    
273  
    imageTargetBlank := true),
274  
    
275  
    textPost("2020/02/23", "Anki Vector! Plus: Solving the Winograd Challenge Pt. 4",
276  
      p("Fame, here we come...") +
277  
      
278  
      p(youtubi("ixEmFESf3L4")) +
279  
      
280  
      p("Bob paid for Charlie's college education. He is very [generous/grateful]. Who is [generous/grateful]?")),
281  
       
282  
    textPost("2020/02/18", "Solving the Winograd Challenge (Pt. 1 to 3)",
283  
      p("Understanding everyday scenarios.") +
284  
      
285  
      p(youtubi("zbaV5rs94JA") + " " + youtubi("lsXsjA2n7RA") + " " + youtubi("1mrxPK4WaLE"))),
286  
    
287  
    textPost("2020/02/10", "AI goes mobile. And speedrun continues",
288  
    
289  
    p("Check it ouuut!") +
290  
    
291  
    p(youtubi("W4IP3eTTfJ8") + " " + youtubi("f-WHXNWw5bg")
292  
      )),
293  
    
294  
    textPost("2020/02/03", "Training a Voice Activity Detector",
295  
    
296  
    p("For always-on devices without Big Tech snooping. More soon.")),
297  
    
298  
    textPost("2020/01/19", "Speedrun to AI continues",
299  
    
300  
    p(youtubi("uhplXw9VsJ8") + " " + youtubi("alRzPG_JQH8") + " " + youtubi("jvHiAClDOtY") + " " + youtubi("ooSpHbUUUFA") + " " + youtubi("t_txQ4vkDlY") + " " + youtubi("d7XWxMnIUpM")) +
301  
    p("Results growing by the day")),
302  
    
303  
    textPost("2020/01/18", "Auto-jump-cut your videos with this free tool",
304  
    
305  
    p(youtubi("eS-QsAh2pT8")) +
306  
    
307  
    p("Thanks to Tom for making this video! Download links " + ahref(youtubeURL("eS-QsAh2pT8"), "in the video description") + ".")),
308  
    
309  
    textPost("2020/01/18", "Stefan Reich about the future of JITs",
310  
    
311  
    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.") +
312  
    
313  
    p("(A little sound bite you can quote)")),
314  
   
315  
    textPost("2020/01/02", "So what is this mystery logic engine? (and other videos)",
316  
    
317  
    p(joinWithSpace(lambdaMap youtubi(splitAtSpace("TuKDBeVSBoo UfezfehUBEQ WKwtl4RWqNo EO2EiqNd91A"))))),
318  
    
319  
    textPost("2019/11/26", "Our Services", // Don't change date, it's linked
320  
    
321  
    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.")) +
322  
323  
ul(map dropMinusPrefix(tlft([[
324  
-Bot is added to your web site by including one line of HTML
325  
-Bot can greet every customer or pop up on click
326  
-Bots will answer questions from a list you provide
327  
-Bots understand typos and synonyms
328  
-Works on desktop and mobile browsers
329  
-Conversation with user is stored in cookie (not lost when browser is closed)
330  
-Bot can also be deployed on any messenger platform (Slack, Discord, Telegram and Viber available, any other platform on request)
331  
-Bots can serve input forms (e.g. contact form)
332  
-You get a web interface where you can see all the bot's conversations
333  
-After the bot is launched, you can edit its questions and answers in the same interface
334  
-Bots can support multiple languages at once (English/German, other languages on request)
335  
-Bots can send a mail, SMS, Viber message etc. to you on any event (e.g. after user completes a form)
336  
-Bots are usually completed in 7 days or less
337  
-Web site bots are compatible with GoDaddy site builder
338  
-We host your bot for free for one year, after that for a small fee (5€/year)
339  
-Bots can support additional functions like playing music in Discord voice chat
340  
-Bots can be deployed as Windows programs
341  
-You have the option to host the bot yourself if you have your own server infrastructure (VPS/dedicated/cloud)
342  
]]))) +
343  
344  
  p("Example public bots:") +
345  
346  
  ul(
347  
    ahref("https://top.gg/bot/625377645982384128", "MKLab FM") + " - plays a 24/7 EDM radio stream in Discord voice chat",
348  
    ahref("https://top.gg/bot/602481480266153984", "GBot") + " - performs Google searches in Discord",
349  
    ahref("https://top.gg/bot/631845126095896579", "The Owl") + " - Discord greet & farewell bot"
350  
    ) +
351  
    
352  
    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" + "."))),
353  
  
354  
    textPost("2019/11/25", "Chat bot released",
355  
    
356  
    p(targetBlank("https://mmozumder.com/", "Managing customer inquiries") + " :)")),
357  
    
358  
    textPost("2019/11/15", "Fiverr bots now ready within 7 days",
359  
    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.")),
360  
    
361  
    imagePost("2019/10/28", "Girlfriend Bot",
362  
    #1102795, "25%",
363  
    
364  
    p("182 rules and 104 synonyms. Always there for you.") +
365  
    
366  
    p("And yes, before you ask, we can do \"boyfriend bots\" too :-D") +
367  
    
368  
    p("(Not the same as a real one, but what's wrong with some fun and games?)"),
369  
    left := true),
370  
    
371  
    imagePost("2019/10/24", "Let's mix English and Python",
372  
    #1102774, "25%",
373  
    
374  
    pre([[
375  
theory validity {
376  
  // a human weighs between 80 and 400 pounds
377  
  $x is a human
378  
    & $x weighs ($y pounds)
379  
    => $y >= 80 & $y <= 400
380  
   
381  
  contradiction => say (That can't be right)
382  
}]])
383  
384  
     + p("Yes, this works already. " + ahref("https://agi.topicbox.com/groups/agi/Tda20a46822c5bb8d", "Full program and some responses."))
385  
     
386  
     + p("So yes, the speedrun definitely continues&mdash;just without videos right now.")
387  
     
388  
     + p("Creating a very nice \"girlfriend\" bot with a friend too.")),
389  
     
390  
    textPost("2019/10/09", "Speedrun to AI",
391  
    
392  
    p("I code until it's done.") +
393  
394  
    p(youtubi("CLk_volfMR8") + " " + youtubi("MWINSJtoPFQ"))),
395  
    
396  
    textPost("2019/10/05", "Philosophy Bot I",
397  
    
398  
    p(targetBlank("http://code.botcompany.de/1025576", "Bot") + " receives facts:") +
399  
400  
    pre([[
401  
RAM has a size
402  
I have RAM
403  
]]) +
404  
405  
    p("And asks:") +
406  
  
407  
    pre("What is the size of my RAM?") +
408  
    
409  
    p("To achieve this, we invent and implement a whole new language which mixes English and Python. Complete program: 299 lines.") +
410  
      
411  
    p(ahref(youtubeURL("JUaDwmnBTHQ"), "2:45:07 mega-stream.")) +
412  
    
413  
    p(youtubi("JUaDwmnBTHQ"))),
414  
    
415  
    imagePost("2019/10/03", "A popular comment about JavaX",
416  
    #1102746, "25%",
417  
    
418  
    p("It is a good idea after all.")),
419  
    
420  
    imagePost("2019/09/28", "Music bot delivered!",
421  
    #1102724, "15%",
422  
    
423  
    p(targetBlank(botCompany_mkLabBotLink(), "Our new bot") + " plays " +
424  
      targetBlank("https://tinyurl.com/mklabradio", "MKLab FM") +
425  
      ", a very nice (and free) electronic dance music radio, in " +
426  
      targetBlank(botCompany_mkLabBotLink(), "your Discord server.")),
427  
      
428  
    left := true),
429  
    
430  
    textPost("2019/09/20", "I'll accept another investment",
431  
    
432  
    p("1000 € are a good number and will help this project a lot :)") +
433  
    
434  
    p("It can either be a gift, an investment or a bot order, depending on your wishes...") +
435  
    
436  
    p("Let's just talk about it.")),
437  
    
438  
    textPost("2019/09/28", "A bot in 40 lines&mdash;including a DSL translator",
439  
    
440  
    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.") +
441  
    
442  
    p("OK the concept is not completely new, but it does work exceptionally well in JavaX.") +
443  
    
444  
    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") + ".") +
445  
    
446  
    p(youtubi("PFyDi1HjU2Y"))),
447  
    
448  
    textPost("2019/09/25", "More live coding",
449  
    
450  
    p("Spends the time, pays the bills.")
451  
    
452  
    + p(youtubi("OluvmrZnA0A"))),
453  
    
454  
    textPost("2019/09/21", "A bot that controls YouTube",
455  
    
456  
    p(youtubi("ABoAXh8ZaEk"))),
457  
    
458  
    textPost("2019/09/20", "selfType",
459  
    
460  
    p("Another functioning JavaX keyword invented in a few minutes.") +
461  
    
462  
    preWithIdentifierExplanations([[
463  
class Me {
464  
  selfType hello() { print("hello!"); this; }
465  
}
466  
467  
new Me().hello().hello();
468  
]],
469  
  "selfType", "selfType is replaced with the enclosing class's name") +
470  
471  
    p("selfType just refers to the enclosing class. Avoid repetition. It really shines in combination with includes.")),
472  
473  
    textPost("2019/09/19", "A bot that learns synonyms",
474  
    
475  
    p(youtubi("0gmwaqmjKhM"))),
476  
    
477  
    textPost("2019/09/17", "A new concept of a program",
478  
    
479  
    p([[Let's say a program is something that describes itself,
480  
    tests itself and improves itself.]])),
481  
    
482  
    /*textPost("2019/09/17", "7 levels (or is it 8?)",
483  
    
484  
    p_b("The whole stack of AI.") +
485  
    
486  
    pre(htmlJavaIdentifierTooltips([[
487  
ENGLISH
488  
  -> NL parser -> NL associated to templates
489  
  -> function maker -> JavaX source
490  
  -> JavaX transpiler -> Java source
491  
  -> eclipsec -> Java byte code
492  
  -> HotSpot -> assembler source
493  
  -> HotSpot's assembler -> machine code
494  
  -> a suitable CPU -> actual bit operations
495  
]],
496  
  "NL", "natural language",
497  
  "JavaX", "a higher-level extension of Java")) +
498  
499  
  p("All of these translators exist already&mdash;except the top two.")),*/
500  
501  
    imagePost("2019/09/16", "Ridiculously Fast Image Recognition",
502  
    #1102664, "50%",
503  
    
504  
    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.") +
505  
    
506  
    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.") +
507  
508  
    p("And what that cornerstone operation is? Welll... <i>stay tuned</i> is all I can say.")),
509  
    
510  
    textPost("2019/09/13", "Whenever my language bores me",
511  
    
512  
    p([[...I extend it. (Have I said that before? Deja vu!)]]) +
513  
    
514  
    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.]]) +
515  
    
516  
    pre(htmlJavaIdentifierTooltips([[
517  
sS bla() {
518  
  S x = "hello";
519  
  embedded S calc() { ret x + " " + x; }
520  
  ret calc() + " " + calc();
521  
}
522  
]],
523  
  "sS", "short for: static String",
524  
  "S", "short for: String",
525  
  "ret", "short for: return",
526  
  "embedded", [["embedded" allows you to put a function where they would not normally be allowed]]
527  
  )) +
528  
529  
    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") + [[.]]) +
530  
    
531  
    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".)]]) +
532  
    
533  
    p(targetBlank("http://code.botcompany.de/1025201", "Example with translation to Java."))),
534  
    
535  
    imagePost("2019/09/10", "A programming language that makes DOOM levels",
536  
    #1102659, "50%",
537  
    
538  
    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.")
539  
    
540  
    + p("Oh, ah... " + targetBlank("https://jmtd.net/wadc/", b("link")) + ".")),
541  
    
542  
    textPost("2019/09/01", "This program is a Discord fan",
543  
    
544  
    p(youtubi("CvcafQ6YTlQ"))),
545  
    
546  
    imagePost("2019/08/31", "Beta Software!",
547  
    #1102549, "50%",
548  
    
549  
    p("But a " + targetBlank("http://recognizer.botcompany.de", "good one") + ".")),
550  
    
551  
    textPost("2019/09/01", "Constructs that Java needed",
552  
    
553  
    p("Question-dot.") +
554  
    pre([[c ?. setDoubleBuffered(b);]]) +
555  
    p(b("=>")) +
556  
    pre([[if (c != null) c.setDoubleBuffered(c);]])),
557  
    
558  
    textPost("2019/09/01", "Zero Training Time Neural Networks",
559  
    
560  
    p("New invention.")),
561  
    
562  
    imagePost("2019/09/01", "Paging The Reflex",
563  
    #1102552, "50%",
564  
    
565  
    p("&nbsp;")),
566  
    
567  
    imagePost("2019/08/31", "Unix just doesn't understand me...",
568  
    #1102550, "50%",
569  
    
570  
    p("Huh."),
571  
    left := true),
572  
    
573  
    imagePost("2019/08/26", "Chess Board Recognition",
574  
    #1102266, "35%",
575  
    
576  
    p("Coming up.")),
577  
    
578  
    textPost("2019/08/18", "You can help train desktop image segmentation",
579  
    
580  
    p(youtubi("W6eJSCGEkSE"))),
581  
    
582  
    textPost("2019/08/15", "Giraffe v3&mdash;now stores information",
583  
    
584  
    p(youtubi("gbQNejT1xdk"))),
585  
    
586  
    textPost("2019/08/12", "Building a simple translator in agi.blue",
587  
    
588  
    p("The demo is word-based, but we have a function for efficient phrase-based translation too.") +
589  
    
590  
    youtubi("w2gJ63tvTW8")),
591  
    
592  
    textPost("2019/08/12", "An array with O(log n) time for all operations",
593  
    
594  
    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.") +
595  
    
596  
    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.")),
597  
    
598  
    imagePost("2019/08/11", "Today I wrote a whole bot",
599  
    #1101842, "25%",
600  
    
601  
    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.")
602  
    + " " + targetBlank("http://code.botcompany.de/1024415", "Code made."))),
603  
    
604  
    textPost("2019/08/10", "Live Coding For Nerds",
605  
    
606  
    p("Stefan Reich builds agi.blue, the Google-killing AI database & chat bot making platform. New functions built: Inter-slice links, Delete page, Checkboxes.")
607  
    + youtubi("7ZRvktYYHuk")),
608  
    
609  
    textPost("2019/08/09", "I did my first live-coding stream",
610  
    
611  
    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.]])
612  
    
613  
    + p([[And of course, code got made. Specifically, agi.blue slices now have ]] + targetBlank("https://agi.blue/?slice=jbmjskptrptihmzk", "owners") + ".")),
614  
    
615  
    textPost("2019/08/04", "\"Be Thankful\"",
616  
    
617  
    p("Randall Brown &amp; band (including me).") +
618  
    
619  
    youtubi("debRuSo8CZk")),
620  
    
621  
    textPost("2019/08/04", "Why AGI.blue beats Google",
622  
    
623  
    p("Because White-Box.") +
624  
    
625  
    youtubi("bwUE_XJMbok")),
626  
    
627  
    imagePost("2019/08/01", "Let's make programs",
628  
      #1101823, "40%",
629  
    
630  
      p("...that understand everything.")),
631  
    
632  
    textPost("2019/07/28", "Revamping agi.blue",
633  
    
634  
    p(targetBlank("https://agi.blue", "agi.blue") + " now has a query language that looks like this:")
635  
    
636  
    + pre([[
637  
word types / is plural of / $x
638  
$y / is a / $x
639  
return $y
640  
]])
641  
642  
   + 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") + ".")),
643  
   
644  
    /*textPost("2019/07/26", "Devastating HTTPS bug in JDK 11+12; fix might be coming",
645  
    
646  
    p("This really needs to be fixed. Can't upgrade my web server. "+ ahref(tb_mainServer_pretty() + "/ssl-bugreport.tgz", "Demonstration for download."))
647  
    
648  
    + p("Update: This seems to be fixed in JDK 13 which is nearing general release. Very nice!")),*/
649  
    
650  
    imagePost("2019/07/25", "GBot googles in your Discord",
651  
    #1101771, "20%",
652  
    
653  
    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.")),
654  
    
655  
    textPost("2019/07/14", "Coarse Procedures &amp; Power Words",
656  
    
657  
    p(targetBlank("http://code.botcompany.de/1023890", "Coarse Procedures.") + " " + targetBlank("http://code.botcompany.de/1023964", "Power Words.")) +
658  
    
659  
    + p("Concepts we need.")),
660  
    
661  
    textPost("2019/07/08", "AI Does Simple Reading Comprehension",
662  
    
663  
    p("Consider this text:")
664  
    
665  
    + pre([[
666  
First, I wake up. Then, I get dressed.
667  
I walk to school. I do not ride a bike.
668  
]] + targetBlank("https://lingua.com/english/reading/my-day/", "[...]") + [[
669  
670  
Question 1: What happens first?
671  
672  
  1 Get dressed   2 Wake up
673  
  3 Eat lunch     4 Walk to school
674  
  
675  
[+4 more questions]
676  
]])
677  
678  
    + p(targetBlank("http://code.botcompany.de/1023742", "Program that solves this.") + " (One screen of code as always.)")
679  
    + 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")) + ":")
680  
    
681  
    + pre_htmlEncode([["(?<!not )like", "not like", "dinner", "school", "bed"]])
682  
    
683  
    + p([[The first expression matches on "like", but not on "not like" which avoids some confusion.]])
684  
    
685  
    + 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.)]])
686  
    
687  
    + p("Now on to more challenges!")),
688  
  
689  
    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"),
690  
    #1101682, "25%",
691  
      p(targetBlank("https://agi.blue", "agi.blue") + ". Ask anything.")
692  
    + p(youtubi("b6jtRdV3Ev8"))
693  
    + p("Yeah it's pretty empty. Let's fill it! Just talk. No limits.")),
694  
    
695  
    imagePost("2019/06/27", "We can now build bots for Gitter",
696  
    #1101680, "50%",
697  
    p("Integrating with the world. " + targetBlank("https://gitter.im/qanda-api/Lobby", "A friend's room") + " with some bots.")
698  
    + 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.")),
699  
    
700  
    imagePost("2019/06/23", "When bots work together",
701  
    #1101670, "15%",
702  
    p("Hello Monkey &amp; Gazelle."),
703  
    left := true),
704  
    
705  
    textPost("2019/06/13", "My Fiverr Intro",
706  
707  
    p("Yeah it's unscripted. Geniuses work like that.")
708  
    
709  
    + youtubi("hHsnHuDRGOQ")),
710  
    
711  
    textPost("2019/06/11", "Android assistant is coming back",
712  
    
713  
    p("...now with multi-user support. Download " + ahref("http://android.tinybrain.de", "here") + ".")
714  
    
715  
    + p("No it's not in the play store. Blame Google.")),
716  
    
717  
    textPost("2019/06/15", "Proof that StackOverflow is broken",
718  
    
719  
    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.")
720  
    
721  
    + 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?")),
722  
    
723  
    /*textPost("2019/05/31", "Julian Assange is being killed",
724  
    
725  
    p("UK government " + ahref("https://www.youtube.com/watch?v=tJPbZuaqh8w", "finishes the job") + ".")),*/
726  
727  
    textPost("2019/05/17", "The 3 mental spaces",
728  
    
729  
    p("Human, computer, objective.")
730  
    + youtubi("W3mm7GUN7dE")),
731  
    
732  
    textPost("2019/05/15", "I want to build a team now",
733  
    
734  
    p("No more working alone!")),
735  
    
736  
    textPost("2019/05/15", "Our brains have 2 parts",
737  
    
738  
    p("...and they're (probably) not the ones you think.")
739  
    + youtubi("qIEuvJSy06o")),
740  
    
741  
    /*textPost("2019/05/02", "Beer &amp; Hamburg",
742  
    
743  
    p("Blubb") +
744  
    youtubi("muTDaOiTwC8")),*/
745  
746  
    textPost("2019/05/02", "Phrase Corrector",
747  
    
748  
    p("Approaching AI, chapter 915423") +
749  
    youtubi("qVjndUIivoY")),
750  
    
751  
    textPost("2019/04/30", "One User Second",
752  
    
753  
    p("...should be enough time for a bot to respond.") +
754  
    youtubi("F9FCV8SVpnA")),
755  
    
756  
    textPost("2019/04/29", "The two fundamental ways to make a chat bot",
757  
    
758  
    p("") +
759  
    youtubi("l7Nbk7qAR5M")),
760  
    
761  
    textPost("2019/04/23", "Recognizing things on a screen",
762  
    
763  
    p("More edutainment for your pleasure!")
764  
    + youtubi("tq6uBfbAClc")),
765  
    
766  
    /*textPost("2019/04/23", "Is society stable?",
767  
    
768  
    p("An important question!")
769  
    + youtubi("IcfuXjQh3Bs")),*/
770  
    
771  
    textPost("2019/04/19", "First easter without a death wish",
772  
    p("Now if that isn't a change. Videos about AI coming.")),
773  
    
774  
    imagePost("2019/04/04", "Whenever my language bores me",
775  
    #1101627, "40%",
776  
    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") + ":")
777  
+ [[<pre style="clear: both"><span title="compact module (sharing common code)" style="border-bottom: dotted 1px">cmodule</span> BigInput {
778  
  <span title="short for: String" style="border-bottom: dotted 1px">S</span> text; // auto-persisted string field
779  
  <span title="A field that can be changed through the module's popup menu" style="border-bottom: dotted 1px">switchable</span> int fontSize = 40;
780  
  <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>));
781  
}</pre>]]
782  
    + 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."))
783  
    ),
784  
    
785  
    textPost("2019/03/31", "New stuff to test",
786  
    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.)")),
787  
    
788  
    /*textPost("2019/03/27", "New domain",
789  
    
790  
    p("dialogkit.xyz [in preparation] - in two minutes to your bot. And it's free")),*/
791  
    
792  
    textPost("2019/03/27", "From dialog to chat bot 101",
793  
    p("(In a few steps, that is.)")
794  
    + pre([[
795  
What time is it?
796  
It's 5:30
797  
Why did you say that?
798  
Because you asked me what time it is.
799  
]])),
800  
801  
    imagePost("2019/03/26", "Bots now available 'standalone'",
802  
    #1101625, "50%",
803  
    p("One huge jar file. Includes a GUI and a database. And learns from the cloud while running.")),
804  
    
805  
    imagePost("2019/03/24", "Gazelle",
806  
    #1101622, "30%",
807  
    
808  
    p("...will explain itself (as a general principle)."), left := true),
809  
    
810  
    textPost("2019/03/17", "First professional bot being built",
811  
    p("Not sure if I'm allowed to tell you more yet... :-)")),
812  
    
813  
    textPost("2019/03/22", "My OS is really happy with 8 GB of RAM",
814  
    p("...and any Windows installation. Enough space for AI experiments&mdash;and enough space for memory-hungry Firefox. " + ahref(osInstallerLink(), "Try it out") + " yourself!")),
815  
    
816  
    imagePost("2019/03/11", "Accommodating human stuttering",
817  
    #1101580, "35%",
818  
    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"]]) + ".")),
819  
    
820  
    textPost("2019/03/07", "Coder muscle flexing :)",
821  
    
822  
    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.")
823  
    
824  
    + 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") + ".")
825  
    
826  
    + 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.")),
827  
    
828  
    textPost("2019/03/07", "Mini-investment needed",
829  
    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."))),
830  
    
831  
    textPost("2019/03/06", "I just made Gazelle scalable",
832  
    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?")),
833  
    
834  
    imagePost("2019/03/03", "Gazelle is offended",
835  
    #1101557, "15%",
836  
    p("No further comment."), left := true),
837  
    
838  
    imagePost("2019/03/02", "Gazelle's Auto-Math Module",
839  
    #1101549, "30%",
840  
    p("Given these example dialogs:")
841  
    + pre_rtrim([[
842  
  10 games of 2 minutes each => that makes 20 minutes
843  
  30 games of 3 minutes each => that makes 90 minutes
844  
    ]])
845  
    + p("Gazelle understands what kind of calculation you mean and performs it for you on new input.")),
846  
    
847  
    imagePost("2019/02/24", "Gazelle Learns",
848  
    #1101499, "50%",
849  
    
850  
    p("Come join us over at " + targetBlank(nextGenBotsDiscordInvite(), "Discord") + "."),
851  
      left := true),
852  
    
853  
    textPost("2019/02/22", "New Discord Group",
854  
    
855  
    p(targetBlank("https://discord.gg/SEAjPqk", "See you there!"))),
856  
    
857  
    imagePost("2019/02/16", "Analyzing Wikipedia",
858  
    #1101493, "50%",
859  
    p("Nothing can stop this.")
860  
    + p("In other news, my current cash level (for the rest of the month) is roundabout 10 €. Money is such a great invention!")),
861  
    
862  
    imagePost("2019/02/15", "Gazelle growing",
863  
    #1101483, "50%",
864  
    p(b("Here soon.")), left := true),
865  
    
866  
    imagePost("2019/02/11", "A new logic engine",
867  
    #1101482, "40%",
868  
    
869  
    p("A logic engine is what makes machines talk.")
870  
    + p("This new one I'm making is really impressive.")
871  
    + 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).]])
872  
    + p([[Surely it needs a cool code name, right? How about... uhm... <b>"Gazelle"</b>? "Panther"? Goldfish? Rubber duck? Something!]])
873  
    + p("Either way: <b>Expect demos soon.</b> Until then, enjoy the chewing gazelle.")),
874  
    
875  
    textPost("2019/02/08", "Who smokes dope?",
876  
    
877  
    p("Input:")
878  
    + pre("I visited the pope. He smokes dope.")
879  
    + p("Output:")
880  
    + pre("I visited {the pope} [*1]. He [1] smokes dope.")
881  
    + p([[([*1], [1] and the curly braces mean that "he" points to "the pope".)]])
882  
    + p(ahref("http://code.botcompany.de//1021323", "Function that does this."))),
883  
    
884  
    textPost("2019/02/06", "Ways to eat pizza",
885  
    
886  
    p(targetBlank("http://mattmahoney.net/", "Matt Mahoney") + [[ recently gave this little example of ways in which language is ambiguous:]])
887  
    
888  
    + pre([[
889  
I ate pizza with a fork.
890  
I ate pizza with pepperoni.
891  
I ate pizza with Bob.
892  
]])
893  
894  
     + 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.]])
895  
896  
     + p([[My program is a logic engine that takes the following rules:]])
897  
898  
     + pre([[
899  
// Some reasonings that everybody will understand.
900  
// Sorry for the curly braces, we have to help out the parser a tiny bit.
901  
// First, the 3 different cases of what "pizza with..." can mean.
902  
903  
  I ate pizza with pepperoni.
904  
  => {I ate pizza} and {the pizza had pepperoni on it}.
905  
  
906  
  I ate pizza with Bob.
907  
  => {I ate pizza} and {Bob was with me}.
908  
  
909  
  I ate pizza with a fork.
910  
  => I used a fork to eat pizza.
911  
  
912  
// Now some more easy rules.
913  
  
914  
  I used a fork to eat pizza.
915  
  => I used a fork.
916  
  
917  
  I used a fork.
918  
  => A fork is a tool.
919  
  
920  
  The pizza had pepperoni on it.
921  
  => Pepperoni is edible.
922  
  
923  
  Bob was with me.
924  
  => Bob is a person.
925  
926  
// Some VERY basic mathematical logic
927  
928  
  $A and $B.
929  
  => $A.
930  
  
931  
  $A and $B.
932  
  => $B.
933  
934  
// Tell the machine what is not plausible
935  
936  
  Mom is edible. => fail
937  
  Mom is a tool. => fail
938  
  anchovis are a tool. => fail
939  
  anchovis are a person. => fail
940  
  ducks are a tool. => fail
941  
  ducks are a person. => fail
942  
  my hands are edible. => fail
943  
  my hands are a person. => fail
944  
]])
945  
946  
   + 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.]])
947  
948  
   + p([[That's it! Now we give the program the following new inputs:]])
949  
950  
   + pre([[
951  
  I ate pizza with mom.
952  
  I ate pizza with anchovis.
953  
  I ate pizza with ducks.
954  
  I ate pizza with my hands.
955  
]])
956  
957  
  + p([[...and it comes up with these clarifications:]])
958  
959  
  + pre([[
960  
I ate pizza with anchovis. => I ate pizza and the pizza had anchovis on it.
961  
I ate pizza with ducks.    => I ate pizza and the pizza had ducks on it.
962  
I ate pizza with mom.      => I ate pizza and mom was with me.
963  
I ate pizza with my hands. => I used my hands to eat pizza.
964  
]])
965  
966  
  + p([[
967  
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).]])
968  
969  
  + 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."]])
970  
971  
  + p(targetBlank("http://code.botcompany.de/1021251", "Full program in my fancy language."))
972  
973  
  + p([[In addition to the results, the program also shows some lines of reasoning, e.g. failed lines:]])
974  
975  
  + pre([[
976  
Interpretation: I ate pizza and the pizza had mom on it.
977  
   => I ate pizza.
978  
   => the pizza had mom on it.
979  
     => mom is edible.
980  
       => fail
981  
]])
982  
983  
   + p([[and successful lines:]])
984  
985  
   + pre([[
986  
Interpretation: I used my hands to eat pizza.
987  
   => I used my hands.
988  
     => my hands are a tool.
989  
]])
990  
991  
   + 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.]])
992  
993  
    + 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.]])),
994  
995  
    imagePost("2019/09/04", "New Module Preview",
996  
    #1101481, "50%",
997  
    
998  
    p("Comin' up.")),
999  
    
1000  
    textPost("2019/02/03", "English to Rule",
1001  
    
1002  
      p("<b>Input</b> (plain English, not executable):")
1003  
    + pre("If something is heavy, it weighs many grams")
1004  
    + p("This should be converted to this <b>rule</b> which is executable:")
1005  
    + pre("fact($something is heavy) => fact($something weighs many grams)")
1006  
    + p("<b>Actual program</b> that does the conversion:")
1007  
    + pre(ahref("http://code.botcompany.de/1021228", "ai_ifToFactRule_2") + [[(
1008  
  "If something is heavy, it weighs many grams",
1009  
  litciset("it"),       // pronouns
1010  
  litciset("something") // nouns
1011  
)
1012  
]])
1013  
    + p("As you see, the only customization the function requires is a list of pronouns and nouns.")
1014  
    + p("Finally, we can <b>test</b> the new rule.")
1015  
    + pre([[
1016  
ai_applyFactToFactRules(
1017  
  "fact($something is heavy) => fact($something weighs many grams)",
1018  
  "John is heavy")
1019  
]])
1020  
    + p("which yields:")
1021  
    + pre([=[[John weighs many grams]]=])
1022  
    ),
1023  
    
1024  
    textPost("2019/02/03", "Switching back to Chrome",
1025  
    
1026  
    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...")),
1027  
    
1028  
    textPost("2019/01/23", "Machine Asks Questions",
1029  
    
1030  
      p("Artificial philosopher in the making.")
1031  
    + p(youtubi("3OD8l25EJ90"))),
1032  
    
1033  
    textPost("2019/01/20", "Collaboration with AIRIS?",
1034  
    
1035  
    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.") +
1036  
    
1037  
    p("There is a language gap to bridge (Python/JavaX), but that's what we went to university for, didn't we?")),
1038  
    
1039  
    textPost("2019/01/12", "The Best Play List",
1040  
    
1041  
    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.")),
1042  
    
1043  
    textPost("2019/01/09", "JavaX vs Smalltalk [the programming language]",
1044  
    
1045  
    p([[You see, I do know a bit of history. I was part of the Smalltalk
1046  
    movement 'cause yeah, that thing has a tremendous charme. Miles ahead of everything.]])
1047  
    + p([[In fact, it just dawned on me, JavaX offers a lot of the fabulous Smalltalk experience&mdash;an integrated virtual machine where
1048  
    source, runnable code, GUIs and orthogonally persistent data intersect each other.]])
1049  
    + 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.]])),
1050  
    
1051  
    textPost("2019/01/06", "Tabs++ (or: avoiding the complexity problem)",
1052  
    
1053  
    p(youtubi("FoAJLMbctoQ"))),
1054  
    
1055  
    textPost("2019/01/04", "Why a Java OS? The \"Kilroy\" Demo",
1056  
    
1057  
    p("Because a next generation OS just has more smartness.")
1058  
    
1059  
    + p(youtubi("2AdbbSf3y-M"))),
1060  
    
1061  
    textPost("2019/01/02", "Frantic action",
1062  
    
1063  
    p("I want to finish the big project now: the talking operating system.")),
1064  
    
1065  
    textPost("2019/01/01", "I should be a CEO",
1066  
    
1067  
    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") + ".")),
1068  
    
1069  
    /*textPost("2018/12/31", "Cryptography is scary",
1070  
    
1071  
    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.")),*/
1072  
    
1073  
    imagePost("2018/12/30", [[The "Third Wave of AI"]],
1074  
    #1101469, "",
1075  
    
1076  
    p([[In the generally quite rotten IT industry, there is now talk of a "third wave of AI". And, interestingly,
1077  
    this time they float pretty much <b>the ideas I have been pushing for the last 5 years</b>.]])
1078  
    
1079  
    + p([[Although of course it's fair to say I still have a lot of tricks in petto they didn't even conceive yet.]])
1080  
    
1081  
    + p([[So is now the time for change?]])),
1082  
    
1083  
    /*textPost("2018/12/30", "I have 4 servers now",
1084  
    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.]])
1085  
    
1086  
    + 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?]])),*/
1087  
    
1088  
    textPost("2018/12/22", "Humanity is still cursed",
1089  
                
1090  
                p("You realize that right? That humanity is nowhere near as free, enlightened and happy as it could be?")
1091  
                
1092  
                + p("The main reason is that they still believe in \"competition\" instead of collaboration... so almost nobody gets anything done.")
1093  
                + p("Happy Christmas! (?)"))
1094  
                
1095  
                , textPost("2018/12/19", "More information about JavaX",
1096  
                
1097  
                p(ahref("http://javax.botcompany.de/", "Finally... :)")))
1098  
                
1099  
                , textPost("2018/12/14", "Downloads Fixed",
1100  
                
1101  
                p("So sorry&mdash;there was a bug in the download files causing installation to fail for new users. Now fixed!"))
1102  
                
1103  
                , textPost("2018/12/13", "Teaching Colors, Hands-Free",
1104  
                
1105  
                p(youtubi("JhBhqdpuFf8")))
1106  
                
1107  
                , imagePost("2018/12/10", [["Alexa Mode" Works]],
1108  
                #1101451, "60%",
1109  
                p([["Alexa Mode" means the computer always listens. Standard feature of my OS.]]), left := true)
1110  
                
1111  
                , imagePost("2018/12/10", "New Language",
1112  
                #1101450, "60%",
1113  
                p("It's a lower-level natural language. Can you read it?"))
1114  
                
1115  
                , imagePost("2018/12/09", "Circle Finder",
1116  
                #1101449, "30%",
1117  
                
1118  
                p("God I love image recognition. ")
1119  
                
1120  
                + p(targetBlank("http://code.botcompany.de/1020191", "Source.") + " Ships as part of my operating system."), left := true)
1121  
                
1122  
                , imagePost("2018/12/06", "Nice little reload buttons",
1123  
                #1101445, "23%",
1124  
                
1125  
                p("Whenever there is new code, one click suffices to get it.")
1126  
                
1127  
                + p("In other news, I am looking for a part-time Java job (maybe). Anyway... something's gotta happen."))
1128  
1129  
                , textPost("2018/12/04", "Onboarding Demo",
1130  
                
1131  
                p(youtubi("l09WeK6uHSE")))
1132  
                
1133  
                , textPost("2018/12/04", "Ordering computers from the universe",
1134  
                
1135  
                p("Can it work?"))
1136  
                
1137  
                , textPost("2018/12/02", "Computer insults me",
1138  
                
1139  
                p("New frontier in computer science. " + targetBlank("http://code.botcompany.de/1019961", 35, linkStyle) + " code lines.")
1140  
                
1141  
                + p(youtubi("XTN0Z60_k00")))
1142  
                
1143  
                , imagePost("2018/12/02", "My own VNC clone",
1144  
                #1101444, "30%",
1145  
                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."))
1146  
                
1147  
                , imagePost("2018/11/28", "Defeating Java Class Loaders",
1148  
                #1101439, "40%",
1149  
                p("<b>Java is great</b>, but its need for class loaders means it's somewhat hard to add code at runtime.")
1150  
                
1151  
                + 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.")
1152  
                
1153  
                + p("In fact, in JavaX, we write and ship only source code; all compilation is done on the fly.") +
1154  
                
1155  
                + p("We can pretty much do the \"holy trinity\": maximum speed, complete freedom of assembly and compact code size&mdash;all at once.")
1156  
                
1157  
                + p("Also, JavaX has \"zero-effort deployment\": Every new line of code you write anywhere is available everywhere immediately. (If you want that.)")
1158  
                
1159  
                + 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."))
1160  
                
1161  
                , textPost("2018/11/27", "Why are my dreams better than reality?",
1162  
                p("I have the greatest dreams... then I wake up to a rather lame reality. How is that even possible?"))
1163  
                
1164  
                , imagePost("2018/11/25", "Much News!",
1165  
                #1101430, "50%",
1166  
                p(ahref(osInstallerLink(), "OS") + " becomes a Cluster OS.")
1167  
                + p("(Meaning, you can treat 3 PCs as one.)"))
1168  
                
1169  
                , imagePost("2018/11/17", "OS Chat Bot v1",
1170  
                #1101424, "35%",
1171  
                p("Come on! Talk to me!"), left := true)
1172  
                
1173  
                /*, textPost("2018/11/25", "Microsoft Meditation",
1174  
                p(youtubi("nWbD1bFqvOE"))
1175  
                + p("6 minutes."))*/
1176  
                
1177  
                , textPost("2018/11/11", "Eyebrow Detection",
1178  
                
1179  
                  p(youtubi("-XafiqgFM9k"))
1180  
                + p("I promised&mdash;and I delivered :)")
1181  
                + p("(This is an example of how even the smallest facial expressions can be used for making a better user interface.)"))
1182  
                
1183  
                , textPost("2018/11/10", "Some Live Programming",
1184  
                
1185  
                  p(youtubi("U2Kl4FY-jcE"))
1186  
                + p("Bad audio, good content."))
1187  
                
1188  
                , textPost("2018/11/10", "AI Testers Wanted!",
1189  
                
1190  
                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.")
1191  
                
1192  
                + 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") + "."))
1193  
                
1194  
                , imagePost("2018/11/06", "Checking Log Files",
1195  
                #1101418, "50%",
1196  
                p("This task may seem trivial to you, but actually it is a key to computer intelligence."))
1197  
                
1198  
                , textPost("2018/11/04", "To Andrzej",
1199  
                
1200  
                p(youtubi("https://www.youtube.com/watch?v=9P1fF0liFtU")))
1201  
                
1202  
                , textPost("2018/10/30", "Next meetup on Nov 15", 
1203  
                
1204  
                p(targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/events/255936823/", "Hamburg.") + " Hoping to prepare a fully intelligent machine until then :D"))
1205  
                
1206  
                , textPost("2018/10/28", "Making a Voice Activity Detection",
1207  
1208  
                p("Another one day project. OK, maybe two... I'm squeezing some other AI things in."))
1209  
                
1210  
                , textPost("2018/10/28", "I'm disappointed with YouTube views",
1211  
1212  
                p("1 view on the latest video? Really?"))
1213  
                
1214  
                , textPost("2018/10/27", "Making a face recognition",
1215  
1216  
                p("Now things get real.")
1217  
                + p(youtubi("FXJVO2fWztk", 450)))
1218  
                
1219  
                , imagePost("2018/10/25", "Sensory Status: +3",
1220  
                #1101412, "30%",
1221  
1222  
                p(b("Internet, Vision, Sound.") + " (A robot's basic needs.)"),
1223  
                left := true)
1224  
                
1225  
             /*   , textPost("2018/10/23", "Creator Awards once again awards the wrong creators",
1226  
                
1227  
                p("What can you say... Americans."))*/
1228  
                
1229  
                , imagePost("2018/10/21", "Faking The Linux Task Bar",
1230  
                #1101408, "50%",
1231  
                
1232  
                p("Anything's possible."))
1233  
                
1234  
                , imagePost("2018/10/15", "JavaX makes the impossible possible",
1235  
                #1101403, "30%",
1236  
                
1237  
                p("Here: Automatically measuring the RAM consumption of individual modules within one Java VM."),
1238  
                left := true)
1239  
                
1240  
                , textPost("2018/10/14", "Speech recognition works",
1241  
                
1242  
                  p(youtubi("yFEiIWW-heE", 450, 450*9/16))
1243  
                + p("Who says you need Google for everything?"))
1244  
                
1245  
                , imagePost("2018/10/10", "Making my own speech recognition",
1246  
                #1101401, "15%",
1247  
                p("It may be possible."))
1248  
                
1249  
                , textPost("2018/10/04", "We are making a bot net",
1250  
                p("...of the good kind. In fact, you are part of it <i>right now</i>.")
1251  
                + p("(It works through JavaScript in the browser. We're not using it yet though, you're just on idle.)"))
1252  
1253  
                , textPost("2018/10/03", "Let's sign stuff!",
1254  
                p("I propose to use asymmetric cryptographic keys for <i>testifying</i> that a certain thing actually happened.")
1255  
                +p("In JavaX, making a public+private key pair is just a single function call:")
1256  
                
1257  
                +hsourcecode([[pki_newKeyPair()]])
1258  
                
1259  
                +p("...which means we can have as many key pairs as we like.")
1260  
                +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.")
1261  
                
1262  
                +hsourcecode([[
1263  
                On October 3rd 2018, I truly said: Oh screw this!
1264  
1265  
Edgar the 3rd himself
1266  
1267  
sig: MC0CFQCWUB9j0c+8e8wagTNmMXs/cq7tuAIUEoXOBbRvw343wOdunTY47rKrUDE=
1268  
signer: publickey:MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4E [...] F9Kg=
1269  
]]))
1270  
             
1271  
                + aname('creatorawards, textPost("2018/09/29", "Applying for Creator Awards",
1272  
                p(youtubi("ZTiqIEbhB8A", 300))
1273  
                + p("Thanks to Andrzej for video production!")))
1274  
1275  
                , textPost("2019/09/25", "Dogs Are Telepathic",
1276  
                p(targetBlank("https://www.sheldrake.org/files/pdfs/papers/JSE_Vol14.pdf", "Proof.") + " Maybe bots can be too?"))
1277  
                
1278  
                , imagePost("2019/09/20", "Programming In Facts",
1279  
                #1101379, "55%",
1280  
                p([[German, this time.]]))
1281  
                
1282  
                , imagePost("2019/09/04", "Bot Simulator",
1283  
                #1101378, "75%",
1284  
                p(b([[Version 1.]])), left := true)
1285  
                
1286  
                , imagePost("2018/08/28", "Voice-to-voice bot",
1287  
                #1101376, "50%",
1288  
                p([[We now have voice recognition &amp; speech output combined into the ]] + targetBlank("http://t.me/Hello_Computer", "Telegram bot") + [[. Actual sci-fi!]])
1289  
                + p([[(PS: The bot said "Good evening dudes".)]])
1290  
                + p([[PPS: The Rubik's cube will have to wait a little...
1291  
                building foundations first.]]))
1292  
                
1293  
                , imagePost("2018/08/18", "Teaching the Rubik's cube to the bot",
1294  
                #1101372, "30%",
1295  
                p("It's a good idea and just about right complexity-wise."),
1296  
                left := true)
1297  
                
1298  
                , imagePost("2018/08/18", "Nice trend",
1299  
                #1101371, "",
1300  
                p("Changing history " + targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/", "on Tuesday") + "."))
1301  
                
1302  
                , imagePost("2018/08/17", "The Study Of Rules",
1303  
                #1101367, "50%",
1304  
                p("It's the duality&mdash;executing &amp; thinking&mdash;that makes this project work."))
1305  
                
1306  
                , imagePost("2018/08/14", "Bot Tests Human",
1307  
                #1101366, "30%",
1308  
                p("It's only fair that they test us first.")
1309  
                + p("(Yeah it's a joke post.) Next up: The other way around!"),
1310  
                left := true)
1311  
                
1312  
                , textPost("2018/08/13", "The Levels Of AI",
1313  
                p(b("Level 1: Literal.") + " Just make some responses. How are you? => I'm good/I have some problems")
1314  
                + 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.)")
1315  
                + p(b("Level 3: Fact management.") + " Some things are true, others aren't. Manage this.")
1316  
                + 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.")
1317  
                + p(targetBlank("https://www.meetup.com/Artificial-Intelligence-Meetup/events/253736347/", "Meeting.")))
1318  
                
1319  
                , imagePost("2018/08/10", "How much",
1320  
                #1101365, "40%",
1321  
                p("...is an AGI? 'cause we deliver."))
1322  
                
1323  
                , imagePost("2018/08/09", "Learning from longer exchanges",
1324  
                #1101364, "50%",
1325  
                p("Getting somewhere.")
1326  
                + p("If you could talk to an AI about any topic&mdash;which one would you choose?"))
1327  
                
1328  
                , imagePost("2018/08/07", "Politics",
1329  
                #1101363, "50%",
1330  
                p("Bot knows (sadly)."),
1331  
                left := true)
1332  
                
1333  
                , imagePost("2018/08/05", "Bot decides",
1334  
                #1101362, "45%",
1335  
                p("Who knows what it will do next?"))
1336  
                
1337  
                , textPost("2018/08/04", "Let's improve the onboarding",
1338  
                p(targetBlank("http://t.me/Hello_Computer", "Channel") + "'s waiting dudes."))
1339  
                
1340  
                , imagePost("2018/08/02", "How the AI is programmed",
1341  
                #1101361, "30%",
1342  
                
1343  
p([[<b>v1 - Make a basic logic using a bastard language</b> located somewhere
1344  
     between Prolog and plain English (mostly it's just the latter).]])
1345  
1346  
                  + pre_trim([[
1347  
input(I'm a scammer!)
1348  
  && fact(a scammer scams people)
1349  
  && relationX(scams people, scam people)
1350  
  => output(You scam people?!)
1351  
]]) +
1352  
1353  
p([[<b>v2 - Add some $ signs and turn spaces into underscores</b>
1354  
     (making the pattern dynamic).]]) + pre_trim([[
1355  
1356  
input(I'm a $scammer!)
1357  
  && fact(a $scammer $scams_people)
1358  
  && relationX($scams_people, $scam_people)
1359  
  => output(You $scam_people?!)
1360  
]])            + p([[<b>v3 - Find out what relationX is</b> (that's not that hard).]])
1361  
1362  
               + p_b([[v4 - Interpret this stuff.]])
1363  
1364  
               + pre([[DONE]])
1365  
               
1366  
               + p([[Estimated time frame: ]] + b([[2 days]]))
1367  
               
1368  
               + p("Edit (2018/08/03): And it's done (see picture)."))
1369  
                
1370  
                , textPost("2018/08/02", "I'm beating them",
1371  
                p("IBM and all the other guys.")
1372  
                
1373  
              + 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:")
1374  
                
1375  
                +pre("{This time of night} it's usually quite cool."))
1376  
                
1377  
                , textPost("2018/07/31", "I still contribute to StackOverflow",
1378  
                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>."))
1379  
                
1380  
                , imagePost("2018/07/31", "Bot Initiative",
1381  
                #1101360, "45%",
1382  
                p("Shurely an important part."))
1383  
 
1384  
                , imagePost("2018/07/28", "Bot needs more logic!",
1385  
                #1101359, "45%",
1386  
                p("We're getting there though."),
1387  
                left := true)
1388  
1389  
                /*, textPost("2018/07/27", "What is AI?",
1390  
                p("AI is " + i("puzzling stuff out") + ".")
1391  
                + p("(You know which meaning of \"puzzling\" is intended here, right? If yes: Then you're a " + i("good puzzler") + ".)")
1392  
                + p("So that's what we build: a " + i("puzzling engine") + "."))*/
1393  
                
1394  
                , imagePost("2018/07/27", "Telegram shaping up",
1395  
                #1101358, "45%",
1396  
                p(targetBlank("http://t.me/Hello_Computer", "Participate!")))
1397  
1398  
                , textPost("2018/07/27", "I should collect money for a new notebook",
1399  
                p([["What, you're doing AI with 4 gigabytes?"]])
1400  
                + p("Yes, that's right. And 512 MB actually go to the GPU, so yeah... it's tight."))
1401  
                
1402  
                , textPost("2018/07/26", "The Simplifier",
1403  
                p("Another working AI component. Takes any sentence or phrase, like:")
1404  
                + pre("smart combinations of various fast methods")
1405  
                + p("and outputs:")
1406  
+ pre(trim([[
1407  
1. combinations
1408  
2. combinations of methods
1409  
3. smart combinations
1410  
4. combinations of fast methods
1411  
5. smart combinations of methods
1412  
6. combinations of various methods
1413  
7. smart combinations of fast methods
1414  
8. combinations of various fast methods
1415  
9. smart combinations of various methods
1416  
10. smart combinations of various fast methods
1417  
]]))
1418  
                + p("Neat, right? And very useful."))
1419  
                
1420  
                , textPost("2018/07/22", "Setting Up Telegram",
1421  
                p([[There'll be ]] + targetBlank("http://t.me/Hello_Computer", "a channel") + [[ and a bot.]]))
1422  
                
1423  
                
1424  
                , textPost("2018/07/22", "The implications of this project",
1425  
                p([[I'm not sure if you have thought this through yet. This is a project that <i>makes computers think</i>.]]))
1426  
                
1427  
                , imagePost("2018/07/20", "A few more steps",
1428  
                #1101357, "45%",
1429  
                p([[...and you'll have the dialog engine you're all waiting for.]]))
1430  
1431  
                /*, textPost("2018/07/22", "The StackOverflow War",
1432  
                p("StackOverflow is completely intolerable if you try to actually work on it. The trolls are in charge there.")
1433  
                + 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..."))*/
1434  
                
1435  
                , textPost("2018/07/18", "English+German Parsers Work",
1436  
                  p("Input:")
1437  
                + pre("\"Confessions of a Burglar Video\"")
1438  
                + p("(It's the name of a video on YouTube.) So... is the video confessing&mdash;or the burglar? Let's ask the parser.")
1439  
                + pre(rtrim([[
1440  
1. Confessions {of {a {Burglar Video}}}
1441  
2. {Confessions {of {a Burglar}}} Video
1442  
                ]]))
1443  
                + p("Yup, it has found the 2 grammatical possibilities. Next up: Semantic analysis to rate these against each other."))
1444  
                
1445  
                , textPost("2018/07/18", "500 installations coming up",
1446  
                p([[We're reaching a nice number of JavaX-enabled computers. And no, they're not all mine.]]))
1447  
1448  
                , imagePost("2018/07/12", "Perfect Parser Coming Up",
1449  
                #1101356, "45%",
1450  
                p([[English&mdash;no problem.]]))
1451  
1452  
                , imagePost("2018/07/12", "The Magic OS",
1453  
                #1101353, "45%",
1454  
                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).]])
1455  
                + p("The communication process behind this is protected using automatic cryptographic signatures."))
1456  
1457  
                , imagePost("2018/07/10", "Teaching Puns To The AI...",
1458  
                #1101352, "45%",
1459  
                
1460  
                p("52 days to world domination."))
1461  
                
1462  
                , textPost("2018/07/10", "News from Zuckerberg",
1463  
                p(youtubi("_zCDvOsdL9Q", 400)))
1464  
1465  
                , textPost("2018/07/07", "56 days",
1466  
                p("until Stefan's OS takes the world."))
1467  
                
1468  
                /*, imagePost("2018/07/05", "News From Israel",
1469  
                #1101349, "30%",
1470  
                p(targetBlank("https://www.aljazeera.com/indepth/inpictures/israeli-forces-assault-palestinians-prepare-demolish-village-180704141245982.html", "Great country.")),
1471  
                picLink := "https://www.aljazeera.com/indepth/inpictures/israeli-forces-assault-palestinians-prepare-demolish-village-180704141245982.html")*/
1472  
                
1473  
                , imagePost("2018/07/02", "Dead Lock-Immune Operating System",
1474  
                #1101348, "30%", p(targetBlank("http://code.botcompany.de/1016805", "Code.")), left := true)
1475  
1476  
                /*, textPost("2018/07/02", "Dear Kirill from the Android team,",
1477  
                
1478  
hParagraphsFromEmptyLines([[I have to get these things off my chest.
1479  
1480  
    1. I used to work at Google. I quit in 2009 because they wanted to waste me.
1481  
1482  
    2. I make an operating system in Java that is ALL THAT ANDROID SHOULD HAVE BEEN.
1483  
1484  
    3. I tried to install WhatsApp on a friend's Android phone yesterday and IT SIMPLY DID NOT WORK.
1485  
1486  
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.
1487  
1488  
    4. In my Java OS, ALL MODULES RUN IN ONE VM AND IT'S NOT A PROBLEM.
1489  
1490  
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>).
1491  
1492  
    5. I have an idea for a better Swing PLAF interface. Just two components: a painter and a "clicker" (event handler). Easy & really transparent.
1493  
1494  
    6. My OS has <b>orthogonal persistence</b> which is... slightly easier than your persistence approach.
1495  
1496  
Cheers.
1497  
1498  
Stefan]]))*/
1499  
                
1500  
                /*, textPost("2018/06/30", "Something must be wrong with reality",
1501  
                  p("The movies we watch have a better plot than the life we actually live. How is that possible?"))*/
1502  
                  
1503  
                , textPost("2018/06/30", "We're doing it again",
1504  
                  invtag('div, style := "float: right; margin-left: 20px; margin-bottom: 20px",
1505  
                    youtubi("lAkuJXGldrM", 300))
1506  
                  + p("Stefan's OS has a greater impact than Windows 95. You just wait and see!"))
1507  
                
1508  
                , textPost("2018/06/27", "Computer checks its own voice",
1509  
                  p(youtubi("ZRkGdIvW5lM", 600)))
1510  
1511  
                , imagePost("2018/06/23", "Stefan's OS v5",
1512  
                   #1101335, "30%",
1513  
                   p("See who else is online, world wide (if you load the module).")
1514  
                 + p([[Also notice the "AI bar" at the top which is a novel invention.]]))
1515  
                   
1516  
                , textPost("2018/06/23", "We are solving the software security crisis",
1517  
                p("The solution is "+ b("source code inspection") + ", and " + ahref("http://javax.botcompany.de", b("JavaX")) + " makes it practical."))
1518  
                
1519  
                , textPost("2018/06/23", "We will now do the Super-Automation",
1520  
                   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."))
1521  
                   
1522  
                , textPost("2018/06/25", "If your language isn't perfect&mdash;how about changing it?",
1523  
                p("Let's say " + b("vanilla Java is too verbose") + ". (Everybody knows this.) Instead of this:")
1524  
                + pre("class ShowBackgroundImage extends DynModule {")
1525  
                + p("I want to type (and see) only this:")
1526  
                + pre("class ShowBackgroundImage &gt; DynModule {")
1527  
                + p(b("In JavaX") + ", that takes " + b("exactly one line") + " in the " + targetBlank("http://code.botcompany.de/759", b("translator")) + ":")
1528  
                + pre(htmlencode([[jreplace(tok, "class <id> > <id> {", "class $2 extends $4 {");]]))
1529  
                + p("And this easily, my language has been extended.")
1530  
                + p(b(targetBlank("http://code.botcompany.de/1016607", "Proof that this works."))))
1531  
1532  
                , textPost("2018/06/20", "Collaboration!",
1533  
                    p(targetBlank("http://www.ort-des-talents.de/", "BrainCircle.")))
1534  
                
1535  
                , textPost("2018/06/20", "Stefan's OS v4",
1536  
                    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."))
1537  
                
1538  
                , imagePost("2018/06/19", "Reading my mails",
1539  
                  #1101332, "30%",
1540  
                  p("Not pretty (where are the graphic designers?), but it works.")
1541  
                  + p(ahref("http://code.botcompany.de/1016066", "Source code") + " (39 lines)")
1542  
                  , left := true)
1543  
                
1544  
                , imagePost("2018/06/18", "First operating system that learns",
1545  
                  #1101331, "30%",
1546  
                  p(b([[What is the world?]])), left := false)
1547  
                
1548  
                , imagePost("2018/06/18", "Advantages of a Java-based OS: Free Profiling",
1549  
                  #1101328, "30%",
1550  
                  p([[You get so many <b>inspection capabilities</b> for free in my OS.]])
1551  
                  + 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)
1552  
                
1553  
                , textPost("2018/06/17", "Memory leak eliminated", p("Gotcha.") + p("I told you Java is stable!"))
1554  
                
1555  
                , imagePost("2018/06/16", "Further chasing the memory",
1556  
                  #1101327, "30%",
1557  
                  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)
1558  
                
1559  
                , imagePost("2018/06/16", "New Look&amp;Feel",
1560  
                  #1016391, "30%",
1561  
                  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)
1562  
                
1563  
                , textPost("2018/06/15", "Fixing the last memory leaks in Java 10", [[
1564  
                <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
1565  
                super-fancy functions like <a href="http://code.botcompany.de/1016334">cleanDefunctACCsInAllThreads</a> that automatically fix
1566  
                memory leaks other Java programmers have never heard of.</p>
1567  
                <p>We will sail memory leak-free! :)</p>
1568  
                ]]) + [[
1569  
1570  
                <!-- A single blog post -->
1571  
                <section class="post">
1572  
                    <header class="post-header">
1573  
                        <img width="48" height="48" title="Stefan Reich's avatar" class="post-avatar" src="]] + snippetImgLink(#1101324) + [[">
1574  
1575  
                        <h2 class="post-title">New Module: YouTube Downloader</h2>
1576  
1577  
                        <p class="post-meta">
1578  
                            By <a href="mailto:info@botcompany.de" class="post-author">Stefan Reich</a> @ 2018/06/14
1579  
                        </p>
1580  
                    </header>
1581  
                    
1582  
                    <div class="post-description" style="clear: both">
1583  
                        <div style="float: right; width: 50%">
1584  
                            <a href="https://botcompany.de/1004590/raw/1101311">
1585  
                                <img title=""
1586  
                                     class="pure-img-responsive"
1587  
                                     src="https://botcompany.de/1004590/raw/1101311" style="width: 100%">
1588  
                            </a>
1589  
                        </div>
1590  
                            
1591  
                        <p>
1592  
                            Today we launched <b>bla bla bla</b>.
1593  
                        </p>
1594  
                        <p>&nbsp;</p>
1595  
                        <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>
1596  
                        <p>Now I need an awesome screenshot module and an awesome auto-upload-to-blog module.</p>
1597  
                    </div>
1598  
                </section>
1599  
  ]]); // end of posts
1600  
  
1601  
  if (nempty(date))
1602  
    allPosts = dropFirst(allPosts, indexOfFirstThat(allPosts,
1603  
      post -> cmp(regexpFirstMatch("20\\d\\d/\\d\\d?/\\d\\d?", post), date) <= 0));
1604  
  
1605  
  LS posts = subList(allPosts, (page-1)*perPage, page*perPage);
1606  
  bool hasPrev = page > 1, hasNext = l(allPosts) > page*perPage;
1607  
  
1608  
  S nav = !hasNext && !hasPrev ? "" 
1609  
    : hsection(joinNempties(" | ", 
1610  
      hasPrev ? ahref(rawSelfLink(str(page-1)), "Last page") : "",
1611  
      ahref("http://javax.botcompany.de/1020398/raw/contact", "Imprint"),
1612  
      hasNext ? ahref(rawSelfLink(str(page+1)), "Next page") : ""),
1613  
    class := "post", style := "text-align: right");
1614  
    
1615  
  // template starts here
1616  
  S html = [[
1617  
<!doctype html>
1618  
<html lang="en">
1619  
<head>
1620  
    <meta charset="utf-8">
1621  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
1622  
    <title>BotCompany.de</title>
1623  
    
1624  
    <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" crossorigin="anonymous">
1625  
    
1626  
    <link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/grids-responsive-min.css">
1627  
    <link rel="stylesheet" href="css/layouts/blog.css">
1628  
]] // BROKEN (deploys.io out of service): + html_nextGenBots_discordWidget()
1629  
+ [[
1630  
</head>
1631  
<body>
1632  
1633  
]] + [[<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js?tracking=1&always=1"></script>]] + [[
1634  
1635  
<div id="layout" class="pure-g">
1636  
    <div class="sidebar pure-u-1 pure-u-md-1-4">
1637  
        <div class="header">
1638  
            <h1 class="brand-title"><a href="https://www.BotCompany.de">]] +
1639  
          himgsnippet(#1102944, width := "300", title := "BotCompany [logo by sadietwiqs]", alt := "BotCompany [logo by sadietwiqs]")
1640  
            //[[Bot]] + html_invisibleSpace() + [[Company]]
1641  
            + [[</a></h1>
1642  
            <h2 class="brand-tagline">English &amp; German Chat Bots</h2>
1643  
1644  
            <nav class="nav">
1645  
                ]] + tag('ul,
1646  
                    li(a("SERVICES", class := "pure-button", href := "https://botcompany.de/?date=2019%2F11%2F26"), class := "nav-item")
1647  
                + " " +
1648  
                    li(a("JAVAX", class := "pure-button", href := "http://javax.botcompany.de"), class := "nav-item")
1649  
                + " " +
1650  
                  /*li(a("GERMAN DEMO BOT", class := "pure-button", href := "http://www.web-woody-lab.de/", target := "_blank"), class := "nav-item")
1651  
                + " " +
1652  
                    li(a("DISCORD GROUP", class := "pure-button", href := "https://discord.gg/T5Sg5ZA", target := "_blank"), class := "nav-item")*/
1653  
1654  
/*                + " " +
1655  
                   li(a("Download Windows", class := "pure-button", href := osInstallerLink()), class := "nav-item")
1656  
                + " " +
1657  
                   + 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")*/
1658  
                   
1659  
                /*+ " " +
1660  
                  li(a("agi.blue", class := "pure-button", href := "https://agi.blue/"), class := "nav-item")*/
1661  
            
1662  
                  + " " +
1663  
                  li(a("Twitch", class := "pure-button", href := "https://twitch.tv/stefanreich"), class := "nav-item")
1664  
                  
1665  
                  + " " +
1666  
                      li(a("Videos", class := "pure-button", href := "https://www.youtube.com/channel/UCSvK6EfxnMTajbe-Qpc6NvA/videos"), class := "nav-item")
1667  
                    //, class := "nav-list")
1668  
                  + " " +
1669  
                      li(a("Meetings", class := "pure-button", target := "_blank", href := "https://www.meetup.com/Artificial-Intelligence-Meetup/"), class := "nav-item")
1670  
                  + " " +
1671  
                      li(a("Slides", class := "pure-button", target := "_blank", href := "https://slides.com/stefanreich"), class := "nav-item")
1672  
                  + " " +
1673  
                      li(a("GBot", class := "pure-button", target := "_blank", href := "https://discordbots.org/bot/602481480266153984"), class := "nav-item")
1674  
                    , class := "nav-list")
1675  
                + [[
1676  
            </nav>
1677  
            
1678  
            <p>&nbsp;</p>
1679  
            <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>
1680  
            
1681  
        </div>
1682  
    </div>
1683  
1684  
    <div class="content pure-u-1 pure-u-md-3-4">
1685  
        <div>
1686  
            <div class="posts">
1687  
                <!--<h1 class="content-subhead">Recent News</h1>-->
1688  
                ]]
1689  
                
1690  
                + hcss(autoUnindent([[
1691  
                  pre { margin-left: 20px; }
1692  
                  tt, pre { font-weight: bold; }
1693  
                ]]))
1694  
                + nav
1695  
                  
1696  
                + lines(posts)
1697  
                
1698  
                + nav
1699  
1700  
                + [[
1701  
                
1702  
            </div>
1703  
1704  
            <div class="footer">
1705  
                <div class="pure-menu pure-menu-horizontal">
1706  
                    <ul>
1707  
                        <li class="pure-menu-item" id="visitors"></li>
1708  
                        <li class="pure-menu-item"><a href="https://stefans-os.botcompany.de" class="pure-menu-link">More</a></li>
1709  
                        <li class="pure-menu-item"><a href="https://www.youtube.com/channel/UCSvK6EfxnMTajbe-Qpc6NvA/videos" class="pure-menu-link">YouTube</a></li>
1710  
                        <li class="pure-menu-item"><a href="http://javax.botcompany.de/1020398/raw/contact" class="pure-menu-link">Impressum</a></li>
1711  
                    </ul>
1712  
                </div>
1713  
            </div>
1714  
        </div>
1715  
    </div>
1716  
</div>
1717  
1718  
</body>
1719  
</html>
1720  
]];
1721  
1722  
  if (nempty(date)) {
1723  
    S title = contentsOfFirstContainerTagWithParams(first(allPosts), 'h2, class := "post-title");
1724  
    if (nempty(title))
1725  
      html = hreplaceTitle(html, title);
1726  
    else
1727  
      print("Warning: No blog entry title found for date " + date);
1728  
  }
1729  
    
1730  
  ret
1731  
    html.replace("\"css/layouts/blog.css\"", htmlQuote(rawSnippetURL(#1016322, "text/css")))
1732  
    .replaceFirst(regexpQuote("<body>"), "<body>" + hSilentComputatorWithFlag("homepage"))
1733  
    
1734  
    // add stuff before closing body tag
1735  
    .replaceFirst(regexpCaseInsensitivePrefix() + "</body>",
1736  
      /*loadJQuery() +
1737  
      hjavascript_src("https://botcompany.de/1026215/raw") + "</body>"*/
1738  
      // scribble doesn't use the right background color yet, and it's not clickable
1739  
      /*hjs_includeScribble() + */
1740  
      "</body>");
1741  
} // end of html()
1742  
1743  
sS textPost(S date, S title, S text) {
1744  
  ret invtag('section, class := "post", style := "clear: both",
1745  
    invtag('header, class := "post-header",
1746  
      invtag('img, width := 48, height := 48,
1747  
        title := "Stefan Reich",
1748  
        class := "post-avatar",
1749  
        src := snippetImgLink(#1101324))
1750  
      + [[
1751  
      <h2 class="post-title">]] + title + [[</h2>
1752  
1753  
                        <p class="post-meta">
1754  
                            By <a href="mailto:info@botcompany.de" class="post-author">Stefan Reich</a> @ ]] + ahref(hquery(+date), date) + [[
1755  
                        </p>
1756  
]]) + [[
1757  
                    <div class="post-description">
1758  
                    ]] + text + [[
1759  
                    </div>]]);
1760  
}
1761  
1762  
sS imagePost(S date, S title, S imageID, S width, S text, O... _) {
1763  
  optPar bool left;
1764  
  optPar bool imageTargetBlank;
1765  
  optPar S picLink;
1766  
  ret textPost(date, title, 
1767  
    invtag('div, style := "float: " + (left ? "left" : "right") + "; width: " + width + "; margin-bottom: 30px; margin-" + (left ? "right" : "left") + ": 30px;", ahref(or2(picLink, snippetImageLink(imageID)),
1768  
    invTag img(title := "",
1769  
      class := "pure-img-responsive",
1770  
      src := snippetImageLink(imageID),
1771  
      style := "width: 100%"), target := imageTargetBlank ? "target" : null))
1772  
  + text);
1773  
}
1774  
1775  
sS youtubi(S url) {
1776  
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url);
1777  
}
1778  
1779  
sS youtubi(S url, int width) {
1780  
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url, width);
1781  
}
1782  
1783  
sS youtubi(S url, int width, int height) {
1784  
  ret isTrue(youtubeOff!) ? "" : youtubeEmbed_newer(url, width, height);
1785  
}
1786  
1787  
sO domainAndURISwitch(S uri, SS params) {
1788  
  S domain = domain();
1789  
  print("BLOG BOT domain: " + domain + ", uri: " + uri);
1790  
  
1791  
  S _uri = uri;
1792  
  uri = addSlashPrefix(uri);
1793  
  
1794  
  if (pkiValidation && startsWith(uri, "/.well-known/"))
1795  
    ret subBot_serveText(loadTextFile(userDir("validation.txt")));
1796  
    
1797  
  if (eqic(domain, "code.botcompany.de")) {
1798  
    long snippetID = parseLong(dropSlashPrefix(uri));
1799  
    ret hrefresh(snippetID == 0
1800  
      ? tb_mainServer_pretty() + "/tb/snippets.php"
1801  
      : tb_mainServer_pretty() + "/tb/show-snippet.php?id=" + snippetID);
1802  
  }
1803  
  
1804  
  if (swic(domain, "javax.")) {
1805  
    pcall {
1806  
      O result = callHtmlMethod2(getBot(#1020398), uri, params);
1807  
      print("Result: " + className(result));
1808  
      ret result;
1809  
    }
1810  
  }
1811  
  
1812  
  if (eqic(domain, "create.botcompany.de"))
1813  
    ret hrefresh(tb_mainServer_pretty() + "/tb/snippets.php?action=create");
1814  
  
1815  
  if (eqic(domain, "recognizer.botcompany.de"))
1816  
    ret subBot_serveRedirect("https://botcompany.de/files/1400260/chess-board-recognizer-0.2.jar");
1817  
    
1818  
  if (eqic(domain, "discord-fan.botcompany.de"))
1819  
    ret subBot_serveRedirect("https://botcompany.de/files/1400274/Discord-Fan.jar");
1820  
    
1821  
  if (domainIsUnder(domain, "stefans-os.botcompany.de")
1822  
    || domainIsUnder(domain, "stefans-os.site"))
1823  
    ret serveStefansOSSite(uri, params);
1824  
    
1825  
  if (domainIsUnder(domain, "zttnn.me"))
1826  
    ret serveZTTNN();
1827  
    
1828  
  if (domainIsUnder(domain, "tomii.me"))
1829  
    ret serveTomiiMe(uri);
1830  
    
1831  
  if (domainIsUnder(domain, "phrasecache.best"))
1832  
    ret hhtml(hhead_title("PhraseCache - Best NLP System")
1833  
      + hbody(hsansserif() + hfullcenter(
1834  
      p(himagesnippet(#1102923, title := "PhraseCache")) +
1835  
      p("by " + ahref("https://botcompany.de", "BotCompany")) +
1836  
      h3("PhraseCache is a simple language for matching natural language inputs.") +
1837  
      p(joinWithBR(
1838  
        ahref("http://code.botcompany.de/1028073", "Latest matching function"),
1839  
        ahref("http://code.botcompany.de/1028083", "Latest scored matching function"),
1840  
        ahref(tb_mainServer_pretty() + "/getraw.php?id=1030319", "Current docs"),
1841  
        ahref("https://tomii.me/nlp patterns.html", "Docs for older version") + " (latest version is backwards-compatible)")
1842  
      ))));
1843  
    
1844  
  if (eqicOneOf(domain, "jumpcut.botcompany.de", "ajc.botcompany.de"))
1845  
    ret subBot_serveRedirect("https://botcompany.de/files/1400263/AutoJumpCut-Installer-0.6-win32.exe");
1846  
  
1847  
  if (isAGIBlueDomain(domain)) {
1848  
    if (eq(uri, "/"))
1849  
      ret htitle("AGI.blue is now Gazelle.rocks") + hrefresh(5.0, "https://gazelle.rocks")
1850  
        + hmobilefix() + hsansserif() + hNoBlueLinks() + hfullcenter("You will be redirected to our latest AGI project: " + b(ahref("https://gazelle.rocks", "GAZELLE"))
1851  
         + repString(3, "<br>") + small(ahref("https://agi.blue/old", "See the old agi.blue system")));
1852  
        
1853  
    if (eq(uri, "/old")) uri = "/";
1854  
    ret eleu_serveSubBot(#1023558, uri, params);
1855  
  }
1856  
    
1857  
  if (ewic(domain, "abots.space"))
1858  
    ret eleu_serveSubBot(#1026318, uri, params);
1859  
    
1860  
  if (swic(domain, "mech."))
1861  
    ret hrefresh("https://botcompany.de/1013927/raw");
1862  
    
1863  
  // add more domains here
1864  
    
1865  
  // URI switches
1866  
  
1867  
  new Matches m;
1868  
  uri = addSlash(uri);
1869  
  if (swic(uri, "/mmozumder/", m))
1870  
    ret callHtmlMethod2(getBot(#1026011), "/" + m.rest(), params);
1871  
  if (swic(uri, "/smart-iptv-solutions/", m))
1872  
    ret callHtmlMethod2(getBot(#1026223), "/" + m.rest(), params);
1873  
  if (swic(uri, "/tomii-boi/admin/", m))
1874  
    ret callHtmlMethod2(getBot(#1026409), "/" + m.rest(), params);
1875  
  if (swic(uri, "/hypercubes/admin/", m))
1876  
    ret callHtmlMethod2(getBot(#1026544), "/" + m.rest(), params);
1877  
  if (swic(uri, "/smart-home/admin/", m))
1878  
    ret callHtmlMethod2(getBot(#1026867), "/" + m.rest(), params);
1879  
  if (swic(uri, "/contractbox/admin/", m))
1880  
    ret callHtmlMethod2(getBot(#1028281), "/" + m.rest(), params);
1881  
  if (swic(uri, "/ada/admin/", m))
1882  
    ret callHtmlMethod2(getBot(#1028301), "/" + m.rest(), params);
1883  
  if (swic(uri, "/exodontia/admin/", m))
1884  
    ret callHtmlMethod2(getBot(#1028921), "/" + m.rest(), params);
1885  
  if (swic(uri, "/cspillai/admin/", m))
1886  
    ret hrefresh("https://cspillai.botcompany.de");
1887  
  if (swic(uri, "/fiverr/"))
1888  
    ret hrefresh("https://www.fiverr.com/stefan_reich/create-a-chat -bot-for-your-website-or-chat-platform");
1889  
  if (swic(uri, "/bookbetternow/admin/", m))
1890  
    ret callHtmlMethod2(getBot(#1028421), "/" + m.rest(), params);
1891  
  if (swic(uri, "/infinici/admin/", m))
1892  
    ret callHtmlMethod2(getBot(#1029306), "/" + m.rest(), params);
1893  
    
1894  
  if (swic(uri, "/newdesign/", m))
1895  
    ret new HttpFromFileSystem(javaxDataDir("newdesign")).serve(m.rest());
1896  
    
1897  
  if (swic(_uri, "/ace-builds/")) try {
1898  
    ret subBot_maxCacheHeaders(serveWithMimeType(loadPage(tb_mainServer_pretty() + _uri), "text/javascript"));
1899  
    
1900  
  } catch print e {
1901  
    ret serve404();
1902  
  }
1903  
   
1904  
  if (eqic(_uri, "/x30.jar"))
1905  
    ret subBot_serveFile(pathToJavaxJar());
1906  
  
1907  
  // add more URI switches here
1908  
  null;
1909  
}
1910  
1911  
sO serveStefansOSSite(S uri, SS params) {
1912  
  try object redirectToHTTPS(uri, params);
1913  
  ret hhtml(hhead_title("Stefan's OS Download")
1914  
    + hbody(hfullcenter(
1915  
      h1("Stefan's OS") +
1916  
      p(b(ahref(osInstallerLink(), "WINDOWS INSTALLER", style := "font-size: 1.25em")) + "<br>" + " (120 MB) which includes everything you need (including Java).") +
1917  
      p("Mac or Linux users and other weirdos: " + ahref("https://botcompany.de/files/1400497/Stefans-OS.zip", "Download JAR, 3.3 MB")) +
1918  
      p("(For the jar file you may need to install " + targetBlank("https://adoptopenjdk.net/", "OpenJDK 8") + " or later - JDK 16 is perfect)") +
1919  
      p("by " + targetBlank("https://BotCompany.de", "BotCompany")) +
1920  
      p("Stefan's OS is open source software. Sources here: "
1921  
        + ahref("https://code.botcompany.de/1024932", "[OS]") + " "
1922  
        + ahref("https://code.botcompany.de/1001639", "[JavaX]"))
1923  
      )));
1924  
}
1925  
1926  
sS serveZTTNN() {
1927  
  ret hhtml(hhead_title("Zero Training Time Neural Networks")
1928  
    + hbody(hfullcenter(
1929  
      h1("Zero Training Time Neural Networks") +
1930  
      p(himageSnippet(#1102921)) +
1931  
      p([[A classifier trained with a few simple labels]]))));
1932  
}
1933  
1934  
sO serveTomiiMe(S uri) {
1935  
  S tomiiVersion = #1400377;
1936  
  File dir = programFile("tomii.me");
1937  
  File versionFile = newFile(dir, "version.txt");
1938  
  if (!eq(loadTextFile(versionFile), tomiiVersion)) {
1939  
    saveTextFile(versionFile, tomiiVersion);
1940  
    print("Updating Tomii to " + tomiiVersion);
1941  
    unzipSnippet(tomiiVersion, dir);
1942  
  }
1943  
  if (eq(uri, "/")) uri = "/index.html";
1944  
  ret new HttpFromFileSystem(dir).serve(uri);
1945  
}
1946  
1947  
sS osInstallerLink() {
1948  
  ret "https://botcompany.de/files/1400496/Install-Stefans-OS-2021-Jun-20.exe";
1949  
}

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: 15531 / 62058
Version history: 1131 change(s)
Referenced in: [show references]