Our webinars are continuing to be as popular as ever and Tom Sydney Kerckhove's (Tech Lead at FP Complete) webinar on "Building Terminal User Interfaces with Haskell" was no exception. We had 426 people registered for the event which aired on Wednesday, November 28th at 10:00 am PST. If you tuned in
In this month's webinar, Tom Sydney Kerckhove will demonstrate just how easy it is to get started with Terminal User Interfaces (TUIs). As a recap, TUIs are text-based user interfaces for use from a terminal. They are usually lightweight, and most importantly, in this webinar, you will learn how easy they are to use. You will also learn how to get up and running by making your own TUI applications with live-coding example TUIs with the Brick library.
Topics to be covered:
- The Brick architecture
- Basic cursors
- Simple example TUI applications
We decided to include the chat log for this webinar, and it can be seen at the end of this blog post. For those of you that want more information the TUI Syd built check out the following links:
A base to start a TUI
A semantic tree-based editor to replace Emacs Org Mode for GTD: https://github.com/NorfairKing/smos
A declarative terminal UI programming library
At FP Complete, we do so many things to help companies it's hard to encapsulate our impact in a few words. They say a picture is worth a thousand words, so a video has to be worth 10,000 words (at least). Therefore, to tell all we can in as little time as possible, we recently produced a new explainer video. Check it out by clicking the video link below. It's only 108 seconds to get the full story of FP Complete. One last thing. We have a home page a facelift, and you can check it out here.
Check out our new Explainer Video
We want your feedback for webinar topics
We would like to hear your suggestions for future webinar topics. The simplest way to accomplish this is to add a comment to this blog post with your suggestion. Alternatively, send your suggestion via email to email@example.com.
Webinar Chat Log
We find it useful to share what was chatted about during the webinar. You can see the chat flow below.
10:00:48 From Michael
10:00:51 From Alexandre Garcia de
10:00:57 From Nick Linker to All
10:01:00 From Andre Artus to All
10:01:22 From Andrey
10:01:34 From Tristian
10:01:37 From Frank Stüss to All
10:01:40 From Artem
10:01:41 From Dan
10:01:45 From Joerg W to All
10:01:46 From Alexei Pastuchov to All
10:02:09 From Frank Stüss to All
10:02:19 From Pedro
10:02:33 From Andrew Starodubtsev to All
10:02:40 From Daniel Leones to All
10:03:06 From Michael
10:03:50 From Pedro
10:03:58 From Pedro Furlanetto : * Library I mean
10:04:12 From Michael
10:04:29 From R
10:04:45 From Michael
10:04:51 From Pedro
10:04:52 From Michael
10:05:21 From Michael
10:05:46 From Tristian
10:05:54 From Niklas Hambuechen to All
10:06:16 From Michael
10:06:19 From Niklas Hambuechen to All
10:06:35 From Michael
10:06:41 From Michael Snoyman : Niklas: thanks for the correction
10:06:43 From Tristian
10:07:56 From Alexandre Garcia de
10:07:59 From Alexandre Garcia de
10:08:19 From Corey O'Connor to All panelists : (
10:08:46 From Alexandre Garcia de
10:08:58 From Michael
10:09:08 From Michael
10:09:12 From Pedro
10:09:30 From Robert
10:09:33 From Konstantin Yegorov to All panelists : C:\Haskell\TUI_webinar\tui-base>stack install
AesonException "Error in $.packages.cassava.constraints.flags: failed to parse field packages: failed to parse field constraints: failed to parse f
ield flags: Invalid flag name: \"bytestring--lt-0_10_4\""
10:09:42 From Michael Snoyman : You need to upgrade Stack, try `stack upgrade`
10:09:50 From Konstantin Yegorov to All panelists : 10x
10:10:10 From Michael Snoyman : I'll save the slides question to the end
10:10:41 From Niklas Hambüchen to All panelists : oren rozen: The example is a simple Haskell package, so like all other packages, it work with nix as well.
10:11:24 From Niklas Hambüchen to All panelists : *works
10:11:33 From Alexandre Garcia de Oliveira : Nope
10:11:40 From furnost to All panelists : Fine by me
10:11:41 From oren rozen : Go ahead
10:11:52 From Nick Linker to All panelists : clear
10:15:43 From Andrey Prokopenko : please move on
10:15:47 From Pedro Furlanetto : can you please, write the type vBox in a comment in the source
10:15:50 From Nick Linker : its ok
10:16:13 From Andre Artus : I'm battling to watch and follow along at the same time.
10:16:17 From Michael Snoyman : https://www.stackage.org/haddock/lts-12.20/brick-0.37.2/Brick-Widgets-Core.html#v:vBox
10:16:51 From Michael Snoyman : Andre: if you're having trouble, keep in mind that the video will also be recorded if you'd like to try going through it with a pause button later
10:17:34 From Andre Artus : Thanks, Michael, I will just watch it now and follow through it later.
10:18:12 From Pedro Furlanetto : Cursor == Zipper?
10:18:18 From Michael Snoyman : Yes
10:18:21 From Alexandre Garcia de Oliveira : Yes
10:18:28 From Pedro Furlanetto : thx
10:18:49 From Nick Linker : Why do we need nonEmptySelectNext/Prev functions and not just fields of NonEmptyCursor data type?
10:19:37 From Michael Snoyman : We would need to tie the knot in a funny way to make that happen. If you try to implement such a field-based approach, you'll see the problem
10:20:59 From Nick Linker : Hm, ok.
10:22:39 From Nick Linker : What the signature of `continue` function?
10:22:46 From Michael Snoyman : One sec
10:22:56 From Nick Linker : a -> EventM a?
10:23:08 From Michael Snoyman : Almost https://www.stackage.org/haddock/lts-12.20/brick-0.37.2/Brick-Main.html#v:continue
10:23:14 From Michael Snoyman : continue :: s -> EventM n (Next s)
10:23:15 From Nick Linker : Thanks!
10:23:23 From Nick Linker : I see.
10:23:38 From Michael Snoyman : In case anyone's curious, I'm using the Stackage search on this page: https://www.stackage.org/lts-12.20/hoogle?q=continue&package=brick
10:23:51 From Nick Linker : Thanks, Michael.
10:25:53 From Corey O'Connor to All panelists : true that @ boolean blindness ;)
10:26:17 From furnost to All panelists : everything clear
10:26:19 From Andre Artus : good so far
10:26:50 From Michael Snoyman : wehavetogodeeper.gif
10:27:01 From Nick Linker : haha
10:29:54 From Alexandre Garcia de Oliveira : Go ahead
10:30:00 From Nick Linker : cool, no question so far
10:30:39 From Pedro Furlanetto : That’s cool
10:30:49 From Niklas Hambüchen : I can't see vty or patat in the deps of patat
10:30:58 From Niklas Hambüchen : sorry "vty or brick"
10:31:18 From Pedro Furlanetto : Let’s dive deeper
10:31:40 From Daniel Leones to All panelists : I think you're using vim. Does Haskell autocompletion is included?
10:31:49 From Robert Pearce : Thanks! gotta bounce. looking forward to the video. This is great <3
10:32:32 From Corey O'Connor to All panelists : (probably a vty bug XD)
10:32:35 From Andrey Prokopenko : cool
10:32:35 From Alexandre Garcia de Oliveira : This is cooler than doing front-end
10:32:39 From bogdan : Hi, can you make a small overview of brick
10:32:42 From bogdan : ?
10:32:47 From Bulent Basaran : How easy would it be to draw dir/files differently?
10:32:52 From Karol Kopiec to All panelists : thx really cool
10:34:08 From Corey O'Connor to All panelists : I would akin brick to a UI toolkit. Like GTK or QT.
10:34:15 From Peter Young : Thanks for presentation. Very cool!
10:34:18 From bogdan : Ok, thank you)
10:34:21 From oren rozen : thank you
10:34:24 From oren rozen : :)
10:34:30 From Andre Artus : Are there higher level UI elements? I.e. composing a from without having to construct everything?
10:34:39 From furnost to All panelists : thanks! amazed at the dev speed
10:34:46 From Daniel Leones to All panelists : Thanks for the presentation.
10:34:59 From Bulent Basaran : in emacs/shell mode: I am getting an error: tui: user error (Terminal does not define required capability "cup")
10:35:17 From Corey O'Connor to All panelists : "composing a form"? As in, handling the user interaction and data submission?
10:35:30 From Michael Snoyman : I don't think we'll be able to debug the emacs shell mode support, sorry
10:35:48 From Bulent Basaran : no problem :-)
10:36:08 From Mo Kweon : will the code be available after this?
10:36:38 From Daniel Leones to All panelists : This: https://github.com/NorfairKing/tui-base
10:36:42 From Pedro Furlanetto : Update the attributes map
10:37:11 From Michael Snoyman : Good call Pedro :)
10:37:18 From Michael Snoyman : I was about to mention it
10:37:23 From Michael Snoyman : But Syd got there first
10:38:02 From oren rozen : Both the selection is red and the file are red
10:38:42 From Pedro Furlanetto : making selected the last?
10:38:45 From Marc Paterno : I am accustomed to using test-driven development,. What Haskell tool or library would you suggest for doing that?
10:38:45 From Iurii Lukaniuk to All panelists : Can we send events to Brick app from another thread?
For example, events about changes of directory contents
10:38:49 From Pedro Furlanetto : (pure guessing)
10:39:08 From Alexandre Garcia de
10:39:12 From Corey O'Connor to All
10:39:13 From Frank Stüss to All panelists : (y)
10:39:13 From Pedro
10:39:13 From SORIN STOICESCU to All
10:39:16 From Bulent
10:39:49 From bogdan : * is out of topic
10:39:52 From Andre
10:40:28 From Artem
10:40:35 From Artem
10:41:53 From Pedro
10:41:53 From Nick
10:42:01 From Pedro Furlanetto : *screen ~= terminal
10:42:23 From Mo
10:42:39 From Pedro
10:42:41 From Michael
10:42:48 From Daniel Leones to All
10:43:13 From Marc
10:43:27 From Nick
Could you describe your workspace
How do you make immediate stack build on save?
How do you make fast reformatting of the last entered piece of code?
How do you
10:43:29 From Jon Schoning to All
10:43:53 From Jon Schoning to All
10:44:22 From Marc
10:45:41 From Pedro
10:46:02 From Karl Berger to All
10:46:06 From Mo
10:46:44 From Nick
10:46:46 From Mo
10:47:12 From Artem
10:47:16 From LUC DUZAN to All
10:47:17 From Mo
10:47:19 From Frank Stüss to All
10:47:21 From Andre
10:47:23 From Daniel Leones to All
10:47:24 From Michael
10:47:26 From SORIN STOICESCU to All
10:47:28 From Karl Berger to All
10:47:29 From Pedro
10:47:36 From Niklas Hambüchen to All
10:47:39 From Dan
10:47:41 From Carlos
10:47:43 From Marcel Tilly to All
10:47:44 From Inga Shchelik to All
10:47:45 From Alexandre Garcia de
10:47:45 From Karol Kopiec to All
10:47:45 From Nick Linker : Awesome
10:47:46 From Andre Artus : Bye.
10:47:46 From Franck Rasolo : Thanks for the presentation, looking forward to the links!
10:47:47 From Frank Stüss to All panelists : bye all
10:47:47 From LUC DUZAN to All panelists : Thank you a lot!
10:47:48 From Corey O'Connor to All panelists : Thanks!
10:47:48 From Andrey Prokopenko : Thanks!
10:47:48 From Pedro Furlanetto : You too
10:47:50 From Konstantin Yegorov to All panelists : Thanks everyone
10:47:53 From Marcel Tilly to All panelists : great presentation
10:47:55 From Mo Kweon : What is a next presentation in the plan?