[00:00.960 --> 00:03.440] Hi, this is Randall Schwartz, host of Floss Weekly.
[00:03.440 --> 00:05.040] This week, Guillermo Amaral joins me.
[00:05.040 --> 00:06.840] We're gonna be talking about SQ Lite.
[00:06.840 --> 00:08.240] From eight years ago, we did a show,
[00:08.240 --> 00:09.480] now we're updating that.
[00:09.480 --> 00:10.840] We're also gonna be talking to Richard Hibbitt
[00:10.840 --> 00:12.720] about his new thing, Fossil.
[00:12.720 --> 00:15.320] You're not gonna wanna miss this, so stay tuned.
[00:15.320 --> 00:43.040] This is Floss Weekly with Randall Schwartz and Guillermo Amaral.
[00:43.720 --> 00:51.400] This episode is brought to you by ITProTV.
[00:51.400 --> 00:53.320] Are you looking to upgrade your IT skills
[00:53.320 --> 00:54.880] or prepare for certification?
[00:54.880 --> 00:58.400] ITProTV offers engaging and informative tutorials
[00:58.400 --> 01:01.600] streamed to your Roku, computer, or mobile device.
[01:01.600 --> 01:02.960] For a free seven-day trial
[01:02.960 --> 01:05.480] and 30% off the lifetime of your account,
[01:05.480 --> 01:10.040] go to ITProTV slash floss and use the code FLOSS30.
[01:10.080 --> 01:13.200] That's F-L-O-S-S-3-0.
[01:13.200 --> 01:14.360] Happy New Year, everyone.
[01:14.360 --> 01:15.800] It's time for Floss Weekly.
[01:15.800 --> 01:18.480] It's another Wednesday, so it's time for another show.
[01:18.480 --> 01:20.840] I am Randall Schwartz, your host, Merlin at Stonehenge.com,
[01:20.840 --> 01:23.920] bringing you as often as I can the big projects,
[01:23.920 --> 01:25.680] the little projects, projects you may be using every day
[01:25.680 --> 01:26.680] and not being aware of it,
[01:26.680 --> 01:28.240] projects you may have never heard of
[01:28.240 --> 01:30.720] but now wanna go download right after the show is over.
[01:30.720 --> 01:32.720] I know I do that a lot on this show as well.
[01:32.720 --> 01:35.480] Joining me this week is my friend Guillermo Amaral.
[01:35.480 --> 01:36.840] Welcome back to the show.
[01:36.840 --> 01:39.320] Hi, everybody. Hi, Randall.
[01:39.360 --> 01:41.920] And where are you speaking to us from?
[01:41.920 --> 01:45.040] Still in my Mexican bunker here, as you can see.
[01:45.040 --> 01:46.600] Okay.
[01:46.600 --> 01:48.840] Hasn't been bombed or blown up by, you know,
[01:48.840 --> 01:50.760] evil Florence? Not yet, not yet.
[01:50.760 --> 01:51.600] Okay. Not yet.
[01:51.600 --> 01:53.200] We're still waiting, though.
[01:53.200 --> 01:56.040] There's a few of them just down the street, I'm sure,
[01:56.040 --> 01:57.920] but apparently not, so.
[01:57.920 --> 01:59.880] Yeah, and I'm in an unusual place.
[01:59.880 --> 02:01.000] I was here back in July.
[02:01.000 --> 02:03.000] I am in Anaheim and in my condo.
[02:03.000 --> 02:04.840] I'm working with Neil Bauman this week
[02:04.840 --> 02:06.760] on insect cruise and stuff.
[02:06.760 --> 02:10.080] And I can see the Matterhorn from here.
[02:10.080 --> 02:12.120] I can see Space Mountain.
[02:12.120 --> 02:13.160] So I am right next to it.
[02:13.160 --> 02:14.520] I see the Disney fireworks every night.
[02:14.520 --> 02:15.440] It's really kind of cool.
[02:15.440 --> 02:16.680] I'm on the 14th floor of this.
[02:16.680 --> 02:17.520] It's really far up here.
[02:17.520 --> 02:18.880] It's kind of fun.
[02:18.880 --> 02:20.880] And my bandwidth is a little challenged here,
[02:20.880 --> 02:23.920] so if at some point I sound a little fuzzy,
[02:23.920 --> 02:25.920] it's not actually me, it's the bandwidth.
[02:25.920 --> 02:27.800] I'm gonna blame it on that.
[02:28.800 --> 02:30.200] For those of you who were able to catch it,
[02:30.200 --> 02:33.320] we had a wonderful time at the Brickhouse last week.
[02:33.320 --> 02:34.960] I'll talk more about that at the end of the show,
[02:34.960 --> 02:36.680] but we had the New Year's Eve celebration there
[02:37.600 --> 02:38.440] and I had a blast.
[02:38.440 --> 02:40.440] And I'm still recovering from that in a few ways.
[02:40.440 --> 02:43.640] So we have a really great guest lined up though.
[02:44.600 --> 02:46.160] Just announced like a couple days ago
[02:46.160 --> 02:47.240] because we had to put everything together
[02:47.240 --> 02:48.240] to make this happen.
[02:48.240 --> 02:51.600] But we have Richard Hipp is going to join us.
[02:51.600 --> 02:52.920] The Richard Hipp.
[02:52.920 --> 02:56.880] You may know him from his shepherding and creating
[02:56.880 --> 03:01.440] and continually developing the SQ Lite server,
[03:01.440 --> 03:03.560] which many, many of you actually have,
[03:03.560 --> 03:04.400] even if you don't know it.
[03:04.400 --> 03:06.000] It's in all of your smartphones.
[03:06.000 --> 03:09.800] It's in most operating systems and really great.
[03:09.800 --> 03:11.440] But we're not gonna talk too much about SQ Lite.
[03:11.440 --> 03:13.960] We're actually going to talk to him in a few minutes
[03:13.960 --> 03:17.040] about the Fossil source code manager,
[03:17.040 --> 03:20.200] which was developed actually to support the SQ Lite project
[03:20.200 --> 03:22.360] as it's becoming a project all on its own.
[03:22.360 --> 03:25.360] So really looking forward to this wonderful conversation
[03:25.360 --> 03:26.280] we're about to have with him.
[03:26.280 --> 03:28.720] We last had him on and I had to go back to my notes.
[03:28.720 --> 03:33.120] Episode 26 of Philosopher's Weekly back in 2008.
[03:33.120 --> 03:34.800] Can you believe we've been doing this show that long?
[03:34.800 --> 03:37.960] Man, that's like seven years or something.
[03:39.800 --> 03:41.280] I haven't looked at Fossil too much
[03:41.280 --> 03:43.200] because again, I want to be kind of naive about it
[03:43.200 --> 03:44.440] so I can ask all the questions.
[03:44.440 --> 03:46.520] I'm sort of parodying you at home,
[03:46.520 --> 03:50.280] proxying you at home, a parody of my own audience, yes.
[03:51.880 --> 03:54.720] Guillermo, what do you know about Fossil and SQ Lite?
[03:54.720 --> 03:59.720] Well, I've seen Fossil being used in SQ Lite actually,
[04:01.280 --> 04:03.480] but I've never worked with it myself.
[04:03.480 --> 04:07.320] But SQ Lite, man, that thing really helped me out
[04:07.320 --> 04:08.680] through college.
[04:08.680 --> 04:12.680] I didn't need to install any Microsoft SQL servers
[04:12.680 --> 04:15.160] or anything, so that helped me out a lot.
[04:15.160 --> 04:17.680] And I do use it a lot in my day-to-day work.
[04:17.680 --> 04:21.760] So it's, Qt uses SQL Lite for most of its stuff too.
[04:21.760 --> 04:24.480] So that's great, I love that thing.
[04:24.480 --> 04:26.320] Well, obviously we should be talking to the expert
[04:26.320 --> 04:29.120] about these two projects, but just before we do that,
[04:29.120 --> 04:30.960] I actually have something I want to talk about.
[04:31.000 --> 04:33.680] We have a sponsored show again, this is really great.
[04:33.680 --> 04:36.560] New sponsor too, ITProTV is a video network
[04:36.560 --> 04:38.400] dedicated exclusively to the world
[04:38.400 --> 04:39.840] of information technology.
[04:39.840 --> 04:41.840] Whether you're looking to jumpstart a career in IT
[04:41.840 --> 04:43.440] or you're already working in the field,
[04:43.440 --> 04:46.080] ITProTV supplements traditional learning methods
[04:46.080 --> 04:48.440] in a fun and engaging way to maximize your learning
[04:48.440 --> 04:50.320] and prepare you for certification.
[04:50.320 --> 04:53.520] ITProTV offers hundreds of hours of content
[04:53.520 --> 04:55.880] with 30 hours being added each week.
[04:55.880 --> 04:58.120] The library includes video courses on Apple,
[04:58.160 --> 05:02.040] Microsoft, Cisco, and more, including A+, CCNA,
[05:02.040 --> 05:06.640] Security+, MCSA, CISSP, and Linux+.
[05:06.640 --> 05:08.760] Courses cover topics like network security,
[05:08.760 --> 05:11.160] Linux, Windows, and OS X support for desktops,
[05:11.160 --> 05:12.200] servers, and more.
[05:12.200 --> 05:14.000] But IT doesn't have to be boring.
[05:14.000 --> 05:16.040] ITProTV hosts tell engaging stories
[05:16.040 --> 05:17.320] and share personal experiences,
[05:17.320 --> 05:19.000] which increases your retention.
[05:19.000 --> 05:22.080] Shows are streamed live and available on demand worldwide
[05:22.080 --> 05:24.440] to your Roku, computer, or mobile device.
[05:24.440 --> 05:26.480] You can also interact with hosts during the show
[05:26.520 --> 05:28.920] and topic-specific web-based Q&As.
[05:28.920 --> 05:30.240] If this looks and sounds familiar to you,
[05:30.240 --> 05:32.400] it's because the guys behind ITProTV
[05:32.400 --> 05:34.520] are huge fans of us at TWIT.
[05:34.520 --> 05:36.840] They have over 10 years of experience in IT learning
[05:36.840 --> 05:39.720] and were inspired by Leo to use the same studio setup
[05:39.720 --> 05:41.600] and equipment that we do at TWIT.
[05:41.600 --> 05:43.040] Even if you're already studying with a book
[05:43.040 --> 05:45.560] or enrolled in a certification or technical degree program,
[05:45.560 --> 05:48.160] this is a fantastic supplement to learn at your own pace
[05:48.160 --> 05:49.520] and track your progress.
[05:49.520 --> 05:51.760] Measure up, practice exams are also included
[05:51.760 --> 05:53.720] with your subscription, and you're also going to get
[05:53.720 --> 05:55.880] virtual machine sandbox lab environment
[05:55.920 --> 05:57.720] for hands-on practice and learning
[05:57.720 --> 06:00.600] with HTML5 support for any OS.
[06:00.600 --> 06:02.880] You can get this all for one low monthly price,
[06:02.880 --> 06:05.600] which includes daily updates and new features monthly.
[06:05.600 --> 06:07.720] It's comparable to the cost of a study guide
[06:07.720 --> 06:10.080] and much cheaper than going to IT bootcamp.
[06:10.080 --> 06:14.440] So check out ITPro.tv slash floss, F-L-O-S-S,
[06:14.440 --> 06:16.760] to upgrade your brain with the most popular
[06:16.760 --> 06:19.240] IT certifications recognized by employers.
[06:19.240 --> 06:20.680] You're ready to get a free seven-day trial
[06:20.680 --> 06:22.280] when you sign up using our offer code,
[06:22.280 --> 06:24.160] which will allow you to check out their courses,
[06:24.160 --> 06:25.560] live stream, and more.
[06:25.560 --> 06:28.000] Subscriptions are normally $57 per month
[06:28.000 --> 06:30.360] or $570 for the entire year,
[06:30.360 --> 06:31.480] but we have a special offer
[06:31.480 --> 06:33.000] because they're huge fans of Twitch.
[06:33.000 --> 06:35.800] If you sign up now and use the code FLOSS30,
[06:35.800 --> 06:40.080] F-L-O-S-S-30, you'll receive 30% off your subscription fee
[06:40.080 --> 06:41.480] for the lifetime of your account.
[06:41.480 --> 06:45.160] That's less than $40 per month or $399 for the entire year.
[06:45.160 --> 06:46.680] And once you reach your 13th month,
[06:46.680 --> 06:49.520] it will reduce your subscription rate even further,
[06:49.520 --> 06:51.880] bringing your cost down to $24.95 a month
[06:51.880 --> 06:54.520] or $249 for the entire year.
[06:54.560 --> 06:59.560] So that's ITPro.tv slash F-L-O-S-S.
[06:59.720 --> 07:02.960] And use the code FLOSS30 to try it free for seven days
[07:02.960 --> 07:04.360] and save 30%.
[07:04.360 --> 07:06.720] We really appreciate their sponsorship for this show.
[07:06.720 --> 07:07.720] And now, without further ado,
[07:07.720 --> 07:09.480] let's go ahead and bring on Richard Hipp.
[07:09.480 --> 07:11.800] Welcome back to the show, Richard Hipp.
[07:11.800 --> 07:14.200] Hey, Randall, thanks for having me on.
[07:14.200 --> 07:15.480] Oh, good to see you again.
[07:15.480 --> 07:17.040] Where are you speaking to us from?
[07:17.040 --> 07:18.840] I'm in Charlotte, North Carolina.
[07:19.720 --> 07:22.080] Awesome, awesome, and you look good, you sound good,
[07:22.080 --> 07:24.160] everything looking good there.
[07:24.840 --> 07:27.600] I sort of like, let's actually start
[07:27.600 --> 07:29.280] with an update on SQLite.
[07:29.280 --> 07:30.760] You want to talk a little bit about the things
[07:30.760 --> 07:32.960] that have changed, I guess, in eight years?
[07:32.960 --> 07:35.480] That's probably quite a few.
[07:35.480 --> 07:39.280] There's been a lot of water under the bridge in eight years.
[07:39.280 --> 07:41.800] No, we work on it full-time now.
[07:41.800 --> 07:43.920] I think when I talked to you last time,
[07:45.160 --> 07:49.560] I was still doing custom software development for people
[07:49.560 --> 07:52.960] as my day job, but now we've got a small team
[07:52.960 --> 07:57.440] and we devote full-time to supporting SQLite.
[08:01.120 --> 08:03.240] Mitchell Baker at Mozilla helped us set up
[08:03.240 --> 08:07.160] the SQLite Consortium, which several large companies
[08:07.160 --> 08:09.280] contribute to that and provides funds
[08:09.280 --> 08:13.360] for several developers to work full-time on SQLite.
[08:13.360 --> 08:14.200] It's been really good.
[08:14.200 --> 08:15.840] We've really improved the product a lot
[08:15.840 --> 08:17.280] in the last eight years.
[08:17.280 --> 08:21.280] Just in the last couple of years,
[08:21.280 --> 08:24.840] we've been doing all these little micro-optimizations,
[08:24.840 --> 08:27.960] change here, change there, that each individual change
[08:27.960 --> 08:32.640] only makes it go 0.1% faster or even less,
[08:32.640 --> 08:36.040] but they add up and so we've actually gotten
[08:36.040 --> 08:41.040] like 65% better performance over the past two years.
[08:43.720 --> 08:45.760] Added lots of really cool features.
[08:45.760 --> 08:50.760] We've got the common table expressions
[08:51.440 --> 08:54.840] partial indices, all the features that you get
[08:54.840 --> 08:59.840] in the great big servers now are available in SQLite.
[09:04.000 --> 09:05.920] For the 10% of my audience that's not actually familiar
[09:05.920 --> 09:08.720] with what SQLite might be, can you sort of back up
[09:08.720 --> 09:12.360] one step and say what this is and why I might use it?
[09:12.360 --> 09:16.280] Well, SQLite is an SQL database engine,
[09:16.280 --> 09:20.320] but unlike Postgres or MySQL or SQL Server,
[09:20.320 --> 09:21.640] it's not a client server.
[09:21.640 --> 09:24.480] It's not designed to scale up.
[09:24.480 --> 09:27.280] It's a small embedded library.
[09:27.280 --> 09:29.680] It becomes part of your application, just links in
[09:29.680 --> 09:32.520] and writes directly to disk.
[09:32.520 --> 09:37.520] So think of it not as a replacement for Postgres or Oracle,
[09:40.080 --> 09:42.440] but as a replacement for Fopen.
[09:42.440 --> 09:47.440] Instead of opening a file and writing your content
[09:47.440 --> 09:51.440] out to a file on disk, you get to use SQL to do that.
[09:51.440 --> 09:53.800] You open a database connection to SQLite
[09:53.800 --> 09:56.920] and it goes directly back and forth to disk.
[09:56.920 --> 09:58.640] And so it's small and lightweight,
[09:58.640 --> 10:02.200] less than 500 kilobytes in size for the whole library,
[10:02.200 --> 10:04.640] writes directly to disk, the entire database fits
[10:04.640 --> 10:07.720] in a single database, a single file on disk.
[10:07.720 --> 10:11.360] So it gets used a lot for application file formats.
[10:11.360 --> 10:12.440] There's a lot of programs out there
[10:12.440 --> 10:15.720] where you do file save or file open
[10:15.720 --> 10:17.320] and it really just opens a connection
[10:17.320 --> 10:19.880] to an SQLite database on disk.
[10:19.880 --> 10:24.880] And it's also used a lot in devices, gadgets, smartphones,
[10:27.560 --> 10:28.760] the internet of things.
[10:28.760 --> 10:31.920] They love to, you know, it's used,
[10:31.920 --> 10:34.640] we got an email some time ago about,
[10:34.640 --> 10:37.640] oh, some company's building a smart oven
[10:37.640 --> 10:39.040] and they've got SQLite in that.
[10:39.040 --> 10:40.840] It's usually in your television set.
[10:41.840 --> 10:43.760] But we're also used in a lot of things.
[10:43.760 --> 10:47.880] You know, the new A350 somehow uses SQLite in the avionics.
[10:47.880 --> 10:50.800] I'm not exactly sure how, but it's there.
[10:51.800 --> 10:54.080] Well, the thing I really liked about it is that, you know,
[10:54.080 --> 10:56.680] I'm often testing, you know, new applications
[10:56.680 --> 10:59.160] that need to talk to bigger databases,
[10:59.160 --> 11:01.680] like a Postgres installation or something like that.
[11:01.680 --> 11:05.280] And what I liked is that SQLite was almost all of that.
[11:05.280 --> 11:08.600] You're still, and I actually haven't looked at it recently,
[11:08.600 --> 11:10.680] so sorry if I'm not updated enough,
[11:11.520 --> 11:13.880] but it's still sort of typeless columns, right?
[11:13.880 --> 11:16.080] But it has a lot of everything else, like transactions.
[11:16.080 --> 11:17.720] Now you said CTE is in there.
[11:18.920 --> 11:22.800] So I could actually run real database applications
[11:22.800 --> 11:24.120] using SQLite.
[11:24.120 --> 11:27.160] It's just, it's not just a structured file server.
[11:27.160 --> 11:28.520] Correct.
[11:28.520 --> 11:31.240] It makes a great way for testing applications.
[11:31.240 --> 11:34.040] And in fact, I think Ruby on Rails,
[11:34.040 --> 11:36.240] if you install the default database engine,
[11:36.240 --> 11:39.680] they use SQLite and then you flip over to Postgres
[11:39.680 --> 11:42.280] or MySQL when you go to deploy.
[11:42.280 --> 11:43.880] So no, it does everything.
[11:43.880 --> 11:46.440] The typing system, I like to call it,
[11:47.960 --> 11:49.200] some people call it weak typing.
[11:49.200 --> 11:50.520] I think it's a purgative term.
[11:50.520 --> 11:51.360] I don't like that term.
[11:51.360 --> 11:53.520] I like to call it flexible typing.
[11:54.440 --> 11:59.440] Think the difference between C++ and Python
[11:59.640 --> 12:00.920] or JavaScript.
[12:00.920 --> 12:02.280] You know, with JavaScript and Python,
[12:02.280 --> 12:04.960] you can put whatever you want into the variable.
[12:04.960 --> 12:07.000] Whereas C++, you have to give it a specific type.
[12:07.000 --> 12:10.880] And so SQLite is more like the scripting languages.
[12:10.880 --> 12:13.920] SQLite really started as a TCL extension.
[12:13.920 --> 12:17.440] It's a TCL extension that escaped into the wild.
[12:17.440 --> 12:22.440] And so it follows the flexible typing rules
[12:22.480 --> 12:25.120] of the scripting languages like TCL.
[12:25.120 --> 12:27.640] But other than that, and it's completely compatible
[12:27.640 --> 12:32.240] with the larger client server database engines
[12:32.240 --> 12:34.800] in the sense that anything that runs on those
[12:34.800 --> 12:37.520] will also typically run on SQLite.
[12:37.520 --> 12:40.520] But SQLite has this additional flexibility.
[12:40.520 --> 12:44.200] And so sometimes people will develop an application
[12:44.200 --> 12:47.920] and they're using SQLite as their prototyping.
[12:47.920 --> 12:52.200] And then they push it out to Postgres or MySQL or MariaDB.
[12:52.200 --> 12:55.120] And then suddenly they get some typing errors
[12:55.120 --> 12:58.880] because those engines are a little bit stricter
[12:58.880 --> 13:01.080] about type enforcement than SQLite.
[13:01.080 --> 13:04.640] Other than that, they're usually pretty much compatible.
[13:04.800 --> 13:06.440] One of the things that I've also found amazing,
[13:06.440 --> 13:08.560] and I think this has happened actually since the show
[13:08.560 --> 13:09.800] that you and I chatted with,
[13:09.800 --> 13:13.640] is there's ways to register Perl callbacks
[13:13.640 --> 13:15.600] from the Perl interface to SQLite.
[13:15.600 --> 13:17.240] So I actually wrote an application
[13:17.240 --> 13:18.080] where somewhere in the middle
[13:18.080 --> 13:21.200] it used a stored procedure that was written in Perl
[13:21.200 --> 13:23.000] and came back to Perl for that part of it
[13:23.000 --> 13:26.320] and then went back to the SQL being executed.
[13:26.320 --> 13:29.240] Exactly, because it's running locally
[13:29.240 --> 13:31.080] and instead of on a server,
[13:31.080 --> 13:34.120] that means that in your program
[00:00.000 --> 00:07.440] server, that means that in your program, you can register SQL functions that call out to
[00:07.440 --> 00:09.640] your program code.
[00:09.640 --> 00:12.480] We also have this thing called virtual tables.
[00:12.480 --> 00:20.320] So you can register an object, you build an object or subclass an object that instead
[00:20.320 --> 00:25.080] of looking at disk for the data, it looks into the memory data structures of your program.
[00:25.080 --> 00:31.880] So you can, if you have some complex data structure inside your program, you can expose
[00:31.880 --> 00:36.320] that as an SQL table and do joins against it and that sort of thing.
[00:36.320 --> 00:37.320] Wow.
[00:37.320 --> 00:38.320] Wow.
[00:38.320 --> 00:39.320] Okay.
[00:39.320 --> 00:40.840] Well, we could spend all day talking about SQLite, but I'm really a lot more excited
[00:40.840 --> 00:41.840] about Fossil.
[00:41.840 --> 00:46.200] Why don't you give us the background of how Fossil got started and what its problem is
[00:46.200 --> 00:47.200] solving?
[00:47.200 --> 00:48.200] Okay.
[00:48.200 --> 00:51.800] Well, Fossil is a version control system.
[00:51.800 --> 00:59.280] I wrote it originally because as a replacement for CVS for controlling SQLite.
[00:59.280 --> 01:06.120] This was back eight or nine years ago, back when everybody was still using CVS.
[01:06.120 --> 01:09.800] This is back before Git.
[01:09.800 --> 01:14.760] And I needed, I was using, I wrote this wrapper around CVS called CVS track.
[01:14.760 --> 01:19.760] And that, that inspired a much more popular thing called track, which kind of linked into
[01:19.760 --> 01:25.680] this version and provided bug reports and wiki, but we were using CVS track on SQLite.
[01:25.680 --> 01:28.600] I realized I needed something better.
[01:28.600 --> 01:34.080] And so I started putting this, this distributed version control system together based on ideas
[01:34.080 --> 01:37.960] that I got from Monotone.
[01:37.960 --> 01:49.400] And it went live in 2007 and started self-hosting, but it, it's like Git in that it's distributed
[01:50.080 --> 01:56.320] Everybody has a complete copy of the repository and you push and you pull, but it, it's also
[01:56.320 --> 02:04.520] different in that it's designed more toward a tightly controlled centralized projects
[02:04.520 --> 02:05.520] like SQLite.
[02:05.520 --> 02:13.360] SQLite is a public domain and, and because of that, we have to be very careful about
[02:13.360 --> 02:14.360] who contributes to it.
[02:14.360 --> 02:18.360] We cannot accept drive by patches.
[02:18.360 --> 02:24.720] We have to have detailed copyright release documents on file for everybody who contributes
[02:24.720 --> 02:25.720] to it.
[02:25.720 --> 02:30.680] Now it's free for everybody to use, but it's not free for everybody to contribute to.
[02:30.680 --> 02:36.040] I mean, they can make a copy and contribute for themselves, but they can't fold it back
[02:36.040 --> 02:39.520] into the official release with, unless we have all the stuff on hand.
[02:39.520 --> 02:45.000] So Fossil is, is, is geared more toward that sort of project where you have a small core
[02:45.040 --> 02:53.240] team of developers and, but you also want integrated bug tracking and wiki and a blog
[02:53.240 --> 03:00.680] and, but also gives you the distributed features like you have in Git.
[03:00.680 --> 03:04.840] So Fossil is a standalone binary.
[03:04.840 --> 03:10.880] You just download the executable in whatever operating system you want to use and put it
[03:10.880 --> 03:13.840] in your path somewhere and it's installed.
[03:13.840 --> 03:18.800] And that, and that, that standalone binary is both the, the local client and the server
[03:18.800 --> 03:26.480] if, if you want to set up a, a host for it, and it, it, more than just version control,
[03:26.480 --> 03:31.320] it has a lot of the features that you would normally find on a service like GitHub or
[03:31.320 --> 03:39.320] SourceForge where you've got bug tracking and, and lots of reports and an online web
[03:39.320 --> 03:40.320] interface.
[03:41.200 --> 03:48.960] We, I really set out with Fossil to make it DO178B compliant.
[03:48.960 --> 03:59.400] DO178B is a, is the FAA's spec on what you have to do for safety critical software in
[03:59.400 --> 04:00.400] aviation.
[04:00.400 --> 04:06.720] And I got turned on to this because of, of some people who are using SQLite and wanted
[04:06.720 --> 04:10.520] to use it in avionics and I got introduced to it.
[04:10.520 --> 04:16.600] It's a really, really great process for really getting the quality of, of software up.
[04:16.600 --> 04:24.080] And so that's, we try and, we try and keep SQLite to DO178B standards and part of that
[04:24.080 --> 04:25.080] is the conversion control.
[04:25.080 --> 04:34.240] So Fossil is designed to meet the, the DO178B version control standards.
[04:34.240 --> 04:38.720] Really it's sort of an add-on to CVS track and if you go back and look at the old historical
[04:38.720 --> 04:44.800] CVS track and compare the source code to Fossil, you'll actually see a lot of commonality there.
[04:44.800 --> 04:50.480] It's sort of a follow-on to that but instead of using CVS as the backend storage engine,
[04:50.480 --> 04:57.920] it uses a new custom designed distributed version control system.
[04:57.920 --> 05:01.240] So for people familiar with Git, which is again probably going to be the biggest comparison
[05:01.240 --> 05:05.200] here because you're saying distributed version control system, how, how would you distinguish
[05:05.200 --> 05:07.600] Git from, from Fossil?
[05:07.600 --> 05:12.560] I mean, can I still do the same basic things of having like, you said like a whole entire
[05:12.560 --> 05:19.560] repo on my own desk, can I still do the branching and merging and stuff that Git is so well
[05:19.560 --> 05:20.560] known for?
[05:20.560 --> 05:25.560] Yes, the branching and merging, branches are very lightweight, you do the same push and
[05:25.560 --> 05:31.040] pull operations to go to different repositories like you would with Git.
[05:31.040 --> 05:39.840] The big differences would be, well one, Git is designed to support Linux kernel development,
[05:39.840 --> 05:46.960] which is a massive effort with thousands of contributors.
[05:46.960 --> 05:54.760] It's also GPL'd so that you get a lot of drive-by patches where people that you may
[05:54.760 --> 06:02.440] not know just contribute code and that's okay, that community embraces that.
[06:02.440 --> 06:09.440] But Git is designed to support that because with Git when you pull, you specify, well
[06:09.440 --> 06:14.780] I just want to pull this one guy's branch, this one branch off of his repository.
[06:14.780 --> 06:18.400] With Fossil when you push and pull, you push and pull everything.
[06:18.400 --> 06:24.720] So all of the developers see all of, everybody else's code all the time, keeps everybody
[06:24.720 --> 06:26.560] in sync.
[06:26.560 --> 06:30.320] And that works great with small projects, it's preferred with small projects because
[06:30.320 --> 06:34.800] that way everybody's sharing everything.
[06:34.800 --> 06:41.200] That does not necessarily work so well with Linux kernel scale projects because Linux
[06:41.200 --> 06:48.400] doesn't want to see the test branches for thousands of contributors, that's not helpful
[06:48.400 --> 06:49.800] in that style.
[06:49.800 --> 06:54.200] But for something like, for most other projects it is actually helpful to know what everybody
[06:54.200 --> 06:58.560] else is doing all the time.
[06:58.560 --> 07:07.240] So Fossil also supports the distributed wiki, distributed bug tracking so that I can be
[07:07.240 --> 07:13.260] on an airplane disconnected from the internet and I can enter new tickets, trouble tickets
[07:13.260 --> 07:18.240] and bug reports, I can make changes to trouble tickets and bug reports and then when I reach
[07:18.240 --> 07:22.240] my destination and get back on network, it automatically resynchronizes with what other
[07:22.240 --> 07:27.080] people have been doing.
[07:27.080 --> 07:31.240] So yeah, it is very much like Git and people who have been using Git will see a lot in
[07:31.240 --> 07:36.480] common but there's also some philosophical differences there in that we're geared more
[07:36.480 --> 07:43.680] toward BSD style projects as opposed to GPL style projects.
[07:43.680 --> 07:50.640] We find a lot of the people, a lot of our user base, well really Fossil was not designed
[07:50.640 --> 07:55.640] to be a general purpose version control system, it was designed specifically to support the
[07:55.640 --> 08:03.440] needs of SQLite and that other people find it useful is just a bonus, I mean happy that
[08:03.440 --> 08:07.840] other people find it useful but they were using Git and it wasn't working for them
[08:07.840 --> 08:12.360] for some reason and they discovered Fossil and said hey this is what I need, this is
[08:12.360 --> 08:20.560] what I want to do and then they become very, shall we say outspoken proponents of Fossil.
[08:20.560 --> 08:29.720] Do you know how ex-smokers seem to be the most adamant about secondhand smoke?
[08:29.720 --> 08:36.760] It's kind of the same way with ex-Git users who are now on Fossil, they really, they're
[08:36.760 --> 08:39.560] very enthusiastic about Fossil.
[08:40.560 --> 08:43.560] So who else is using Fossil right now?
[08:43.560 --> 08:48.560] I like that reference though, that's very true.
[08:50.560 --> 08:55.560] Well Fossil is self-hosting, SQLite uses it.
[08:55.560 --> 09:01.560] There are many big projects using it right now, the TickleTK project transitioned over
[09:01.560 --> 09:09.520] to Fossil in 2011, they were on CVS at SourceForge and then SourceForge had a big month long
[09:09.520 --> 09:21.520] outage in I think it was February of 2011 and so the TickleTK developers, I'm a former
[09:21.520 --> 09:30.520] TickleTK developer, they call me a member emeritus, that means I've been fired, but
[09:30.520 --> 09:34.520] they decided to go with Fossil and they use it.
[09:35.520 --> 09:41.520] Jörg Sonnenberger over in Germany has been trying to get the NetBSD people to switch
[09:41.520 --> 09:47.520] over to Fossil, that's still a contentious thing, NetBSD has such an incredibly massive
[09:47.520 --> 09:56.520] repository and such long history that it pushes Fossil to its limits and so I think there's
[09:56.520 --> 09:58.520] some resistance there.
[09:58.520 --> 10:04.520] And there's a lot of small projects, one or two or three people using it, but we don't
[10:04.520 --> 10:08.520] have a big user community like you have with Git.
[10:09.520 --> 10:15.520] So what makes Fossil better suited for something like NetBSD in this case?
[10:15.520 --> 10:21.520] You mentioned it's so huge right, and in fact I've worked in NetBSD before and I can attest
[00:00.000 --> 00:06.960] small projects, one or two or three people using it, but we don't have a big user community like
[00:06.960 --> 00:15.920] you have with Git. So what makes Fossil better suited for something like NetBSD in this case?
[00:15.920 --> 00:21.760] You mentioned it's so huge, right? And in fact, I've worked in NetBSD before and I can attest that
[00:21.760 --> 00:28.240] is pretty big. Just a little log on there. It just never ends, right?
[00:30.240 --> 00:37.600] Is there a specific way you would kind of port the history from CVS over to Fossil or
[00:38.160 --> 00:46.800] how would that work? You wrote some scripts that take a CVS repository and export it into Fossil
[00:46.800 --> 00:53.840] directly. And the TickleTK project used those scripts that you wrote in order to do their import.
[00:54.560 --> 01:00.800] And so that works. It's available. Use the search engine to look for it. It's not on our website.
[01:00.800 --> 01:05.360] I think, no, we might have a link to it on our website. And that works well.
[01:07.760 --> 01:14.880] The thing is, right, the NetBSD repo is just really incredibly massive. When you do a checkout,
[01:14.880 --> 01:22.240] it has to create 100,000 new files. And every time you do a commit, it has to check the
[01:22.240 --> 01:30.880] timestamps on all 100,000 files. And that takes time. So commit takes several seconds to happen
[01:30.880 --> 01:37.120] rather than being instantaneous. So there's a lot of reasons why you might be disappointed
[01:37.120 --> 01:44.080] with the performance on a Fossil on a project that big. But for reasonable size projects of
[01:44.080 --> 01:50.480] a few thousand files and only, say, 15 years of development history as opposed to 30,
[01:51.840 --> 01:57.920] it works great. And it's fast and instantaneous and doesn't give any trouble. To be fair,
[01:57.920 --> 02:03.680] we really appreciate Jörg's efforts because he's really stressed Fossil. And we've made a
[02:03.680 --> 02:08.400] lot of significant performance improvements in Fossil based on their experiences with NetBSD.
[02:08.960 --> 02:14.960] A mere 15 years, huh? It's just a tiny little project.
[02:15.600 --> 02:21.040] Right. Well, SQLite is 15 years old. So that's sort of our goal. We want to support
[02:21.040 --> 02:30.800] 15-year-old projects. So is there any other way somebody might find their way to start working
[02:30.800 --> 02:37.680] for you guys? Like actually working as one of your developers there? Yeah. For Fossil, with SQLite,
[02:37.680 --> 02:45.360] we're very particular about who joins the ranks of committers. There's a very small number of
[02:45.360 --> 02:53.440] committers in SQLite. But for Fossil, it's wide open. It's a BSD style license. So we do ask that
[02:53.440 --> 03:00.560] people sign a copyright release that dedicates their contributions or releases their contributions
[03:00.560 --> 03:06.400] to the code under the same BSD license as the rest of the code. But once we have that copyright
[03:06.400 --> 03:13.600] release here on file in my fire safe, which is just back over there, we have hundreds of committers
[03:13.600 --> 03:19.680] to Fossil. Only about a dozen or so of those are active, but we welcome anybody who wants to
[03:19.680 --> 03:26.160] contribute. It's really easy to contribute. It's all ANSI-C code. ANSI-C and SQLite. Oh, did I
[03:26.160 --> 03:35.600] mention that the repository in Fossil is an SQLite database instead of in, say, Git or
[03:35.600 --> 03:43.520] Mercurial where the repository is a pile of files database. So we've got the power of a relational
[03:43.520 --> 03:49.440] database behind Fossil. And that allows us to do a lot more interesting reporting.
[03:51.200 --> 03:56.720] And also, but it's also an interesting thing that, so the SQLite source code is kept in Fossil.
[03:57.760 --> 04:05.040] And Fossil uses SQLite as its repository format. So your listeners can ponder that
[04:05.040 --> 04:16.400] recursion in their spare time. So was there any specific need to go with ANSI-C versus,
[04:16.400 --> 04:25.440] let's say, something like C++? Well, no, I started in ANSI-C because Fossil was sort of a follow-on
[04:25.440 --> 04:35.440] to CVS track. And CVS track started in like 2002. And back then, C++ was not nearly as pervasive
[04:35.440 --> 04:40.720] it is now. And so we just, we kept going in that tradition. I actually, when I was prototyping
[04:41.440 --> 04:47.440] Fossil, I worked in scripting language. I worked in Tickle because typically,
[04:48.080 --> 04:54.000] I see a tenfold productivity enhancement in a scripting language like Tickle or Python or Perl.
[04:56.080 --> 05:03.280] But in my experiments, I wasn't seeing that with my Fossil prototypes. And so I just switched over
[05:03.280 --> 05:09.840] to ANSI-C because that allowed me to compile it down into a standalone binary that didn't depend
[05:09.840 --> 05:15.920] on having an interpreter installed and so forth. And people asked me, well, why is that the case?
[05:15.920 --> 05:22.800] And I originally finally came to realize that in Fossil, the scripting language is SQL.
[05:23.760 --> 05:28.880] So we have SQL that does a lot of the heavy lifting of digging things out of the repository.
[05:29.840 --> 05:36.160] And that works well. And then we also have just plain old ANSI-C to do the low-level bit twiddling
[05:36.160 --> 05:42.960] that you have to do for delta compression and computing diffs and all these kinds of things
[05:44.080 --> 05:49.200] that also go into a version control system. So we kind of get the best of both worlds.
[05:49.200 --> 05:53.920] You've got the full power of SQL to do the really complex things. And then you've got
[05:55.360 --> 06:02.400] plain old ANSI-C to do the low-level moving bits. And that's actually worked out very well.
[06:02.400 --> 06:10.880] It was surprising, but it's a good combination. The benefits to the user are that you do get
[06:10.880 --> 06:19.840] this standalone binary. It's a true cross-platform thing. Now, I know Macurial is another
[06:19.840 --> 06:26.400] distributed version control system that's written in Python. And they say, well, we're cross-platform
[06:26.400 --> 06:32.880] because Python is cross-platform. I'm going to argue that Macurial is single platform. Their
[06:32.880 --> 06:39.360] platform is Python. And you just happen to have Python virtual machines that run on most computers.
[06:41.040 --> 06:48.960] Whereas Fossil truly is cross-platform, you can compile it in binaries for Linux,
[06:48.960 --> 06:58.480] BSDs, Mac, Windows, whatever you're running on. We even have Fossil binaries on Android if you want
[06:58.480 --> 07:08.720] to store a repository on your phone. That's great. So for somebody like me, I mostly use
[07:08.720 --> 07:15.040] Git a lot. I kind of worked into it from working in the Linux kernel for a few years.
[07:17.920 --> 07:23.040] Let's say if I wanted to change over to Fossil and I want to get started with it right now,
[07:23.040 --> 07:30.640] would I find every single thing I have in Git over in Fossil? Can I do pools? Can I do pushes?
[07:33.040 --> 07:34.880] Do I have a staging area, stuff like that?
[07:35.840 --> 07:42.080] Yeah. Most everything you have in Git is also available in Fossil. So if you wanted to just
[07:42.080 --> 07:48.800] play with it, what you would do is just download a pre-compiled binary off the website, put it in
[07:48.800 --> 07:56.000] your path somewhere, and then do a fast export from one of your existing Git repositories and
[07:56.000 --> 08:04.160] pipe that into Fossil. And I think the command is import minus minus Git or something like that.
[08:04.160 --> 08:08.960] And that'll build you a Fossil repository that has everything that your old Git repository has
[08:08.960 --> 08:16.400] in it. And then once you have that, you type Fossil UI the name of the repository, and that
[08:16.400 --> 08:26.240] will bring up your preferred web browser, giving you a GitHub-like website that contains your
[08:26.240 --> 08:31.440] repository. And then you can just explore and play around with it that way. Now Fossil has all the
[08:31.440 --> 08:42.320] same features that Git has, mostly. It doesn't have a staging area. We consider that an advantage,
[08:42.320 --> 08:48.160] not a disadvantage. Most people we talk to find the staging area in Git to be very confusing.
[08:49.440 --> 08:55.760] Certainly newcomers to Git find that very confusing. I know that power users can do some
[08:55.760 --> 09:01.360] really interesting things with the staging area, but we have all the usual things like a stash,
[09:03.440 --> 09:06.960] all the usual commands. The commands are slightly different, but all the same things are there,
[09:06.960 --> 09:22.400] push and pull, clone. What else do you normally? Oh, diff, of course. But Fossil goes beyond Git
[09:22.400 --> 09:26.560] and gives you a lot of the features that you get with GitHub. Like I mentioned, if you do Fossil
[09:26.560 --> 09:33.440] space UI, it starts up a little web browser or web server there and also automatically kicks off your
[09:34.960 --> 09:40.800] preferred web browser and points it at that web server and allows you to surf around the project
[09:41.680 --> 09:48.880] and look at old versions and look at diffs. It gives you a nice timeline down of all of your changes.
[09:49.280 --> 09:57.280] You can click on any two check-ins on this timeline and it'll immediately give you a diff
[09:57.280 --> 10:03.840] between those two check-ins, even if they're in different branches. You can browse backwards
[10:03.840 --> 10:09.360] in time going back to the beginning. I encourage people who are interested to visit the Fossil
[10:09.920 --> 10:20.400] website because the Fossil website is really just a running instance of Fossil on the self-hosting
[10:20.400 --> 10:27.600] Fossil repository. If you click around on there and see what the capabilities are and if you like it,
[10:27.600 --> 10:35.680] you can clone the self-hosting Fossil repository. When you do that, you don't just get the source
[10:35.680 --> 10:43.600] code to Fossil, you get the entire Fossil website. That's pretty awesome actually. We have a question
[10:43.600 --> 10:47.360] actually from the chat room. I want to read this right where it works, whoever he really is or she
[10:47.360 --> 10:52.400] really is. How are the individual revisions identified? Is it some sort of hash or something
[10:52.400 --> 11:02.480] like the other DVCS's do? It's the SHA-1 hash, the same as Monotone and Mercurial and Git. It's the
[11:02.480 --> 11:09.520] SHA-1 hash, exactly. Now any prefix of that hash will do. Any unique prefix will also serve and
[11:09.520 --> 11:15.920] you can also, if you want to go to a particular check-in, you can put tags on check-ins and
[11:15.920 --> 11:23.040] tags push and pull. You can also specify that you want to go to a particular branch and just
[11:23.040 --> 11:27.360] give the branch name and it'll go to the latest version of that branch. Branch names are global
[11:27.360 --> 11:37.680] in Fossil, unlike in Git. With Git, the branch names are local. Every individual has their own
[11:37.680 --> 11:47.680] branch names. Your head branch is different from somebody else's, but with Fossil, the branch names
[11:47.680 --> 11:52.160] are global. It's part of the global namespace. When two people are collaborating, they can
[11:52.880 --> 11:58.000] use a branch name and say, hey, go to this branch and they know they're both talking about the same
[11:58.000 --> 12:02.480] thing. Awesome, awesome. And just to clarify something we talked about earlier and touched on
[12:02.480 --> 12:09.200] and actually the chat room brought up again, Fossil includes the built-in wiki, the built-in
[12:09.200 --> 12:16.960] bug tracker. Are those also operating in a distributed means as well? Can I be able to update
[12:16.960 --> 12:26.480] the wiki and how it all merges back together? What happens to conflicts then? With the wiki,
[12:28.160 --> 12:37.040] right now it's set up to take the last edit wins. The data structure is capable of doing
[12:37.040 --> 12:42.080] complete merges and it keeps the complete history. If you were on an airplane and you made an edit
[12:42.080 --> 12:47.280] and then somebody else made an edit and then when you merged, your edit didn't appear because
[12:47.280 --> 12:51.840] somebody else had overwritten it, then you could resolve that conflict manually.
[12:52.560 --> 12:55.840] The data structure supports some kind of automatic merging of wiki.
[12:58.000 --> 13:02.400] Just never have gotten around to implementing that in the user interface because it's never come up.
[13:05.360 --> 13:10.720] But no, the tickets automatically, they merge things together automatically because every
[13:10.720 --> 13:16.880] time somebody enters a change to a ticket that's time stamped and when it's computing the state of
[13:16.880 --> 13:23.040] a trouble ticket or bug report, it just takes all of the changes in timestamp order and so you can
[13:23.040 --> 13:27.600] enter changes while you're on a plane at 30,000 feet and then when you land push that up and
[13:27.600 --> 13:32.080] other changes have come in subsequent to that, they will get merged in automatically when it
[13:32.080 --> 13:39.760] recomputes. So yes, the wiki and the ticketing and the blog features are all distributed the same as
[13:39.760 --> 13:47.680] the source code is. What was the rest of the question? I'm sorry. I think you pretty much
[13:47.680 --> 13:53.120] covered that. So I'm also curious though, you mentioned earlier that you're using essentially
[13:53.120 --> 13:57.600] SQL as a scripting language. Does that mean I can write push hooks and things like that at SQL?
[13:58.720 --> 14:04.400] You can actually. Well, not directly. We have a
[14:04.400 --> 14:12.800] a language built in that's sort of a cut down version of Tickle which we call TH1
[14:13.600 --> 14:19.680] and or you can opt a compile time to have full blown tickle scripting in there and
[14:20.560 --> 14:27.120] and then with that you can set push and pull hooks which can invoke SQL to query the database
[14:27.120 --> 14:32.800] all you want to or you can just bring up the SQL database in third party applications and query
[14:33.360 --> 14:37.360] things that are in the repository that way and do interesting reports like that.
[14:39.680 --> 14:46.400] That sounds really cool and so is there much of the internal code of fossil written in SQL
[14:46.400 --> 14:53.280] or is it all written in C? Well the internal code is written in C but it does a lot of SQL calls
[14:53.920 --> 15:01.520] and so that takes that greatly reduces the size of the code base because all of the heavy lifting
[15:01.520 --> 15:12.160] is in SQL. Actually the number of lines of source code in fossil and in git is roughly the same
[15:12.160 --> 15:17.680] last time I checked but when I figured that I'm also including all of the source code that
[15:17.680 --> 15:26.720] implements SQLite which is there's a copy in the fossil source tree so if you discount the fossil
[15:26.880 --> 15:33.440] the SQLite source code the fossil source code is much smaller than git because it doesn't have to
[15:33.440 --> 15:41.040] have all the C code to dig down through the pile of files database that git uses instead it uses
[15:41.680 --> 15:48.000] a short little five or ten or twenty line queries to extract the information that it needs
[15:48.880 --> 15:55.680] and this allows it to do a lot of queries that you can't really do in git in the sense that
[15:56.960 --> 16:04.400] we can query you know show me all check in activity that occurred during the month of
[16:05.120 --> 16:13.360] February in 2011 and it'll give you a timeline of just that interval whereas with git if you
[16:13.360 --> 16:19.520] want to see a history of check ins you have to start with a particular branch now and then work
[16:19.520 --> 16:28.080] your way backwards in time to 2011 because that's the way the it's structured on disk
[16:28.960 --> 16:34.160] they actually have to walk their their check entry all the way back to wherever you want to look and
[16:34.160 --> 16:39.760] and figure that way whereas because we're in an SQL database we have indices that will do that for
[16:39.760 --> 16:45.920] us automatically if I like fossil better than I like git which I'm still not convinced of yet
[16:45.920 --> 16:49.040] but I'll give you a chance to convince me a little bit more in a few minutes but
[16:49.040 --> 16:56.000] but is there a way for me to do like what git does with svn where I can have a local git repo
[16:56.000 --> 17:01.280] that's actually pushing and pulling to svn could I do the same with fossil and git or is it only a
[17:01.280 --> 17:14.240] one-way import no um uh well with svn uh we there's a guy um uh name uh um he's over in
[17:14.240 --> 17:19.600] Jerusalem his name is Baruch Bernstein I think who's working on some really cool svn import
[17:19.600 --> 17:27.200] export capability as we speak it's in a branch but uh uh no it's it's kind of a one-way thing
[17:27.200 --> 17:34.880] right now you um you can import and export to git but there's not a way to really keep them
[17:35.840 --> 17:42.880] in sync very well there is a um you know actually there is a an organization that has a git mirror
[17:42.880 --> 17:49.280] of the SQLite source tree on their site I'll have to send you that link I don't have it committed
[17:49.280 --> 17:54.640] to memory but they have a git mirror of SQLite and they're doing that somehow so they're probably
[17:54.640 --> 18:02.560] doing pulls and then pushing them with the fast import fast export protocol of git and moving them
[18:02.560 --> 18:06.720] straight over and that's a great way to compare the capabilities of the two systems you can go
[18:06.720 --> 18:12.160] and visit their website and and and look what they're doing with that the SQLite source tree
[18:12.160 --> 18:18.400] and then visit the the official SQLite source tree which is running fossil and compare the
[18:18.400 --> 18:23.360] capabilities of the two systems that way that would be an interesting uh an interesting
[18:23.360 --> 18:27.920] comparison actually and something you brought up a few minutes ago you said you have a copy of
[18:27.920 --> 18:34.000] SQLite in the fossil source tree does that mean you're maintaining SQLite in the fossil source
[18:34.000 --> 18:39.520] tree now or are you constantly copying over the released versions back to fossil oh I'm we're
[18:39.600 --> 18:46.960] constantly copying over the tip of trunk from SQLite into fossil we use fossil as a test platform
[18:46.960 --> 18:54.480] for SQLite or one of many test platforms so the version of SQLite that's in the version of fossil
[18:54.480 --> 19:04.080] that's on the official websites now is from two days ago it's a an alpha copy of SQLite 388
[19:04.880 --> 19:11.920] and uh that's a great way to really stress uh SQLite in a real world application in advance
[19:11.920 --> 19:17.520] of a release you know how difficult it is to get people to beta test software I mean
[19:20.240 --> 19:24.400] it's like pulling teeth nobody wants to do it everybody wants an official release
[19:24.400 --> 19:29.040] how do you get people to test it so that you find the problems before released
[19:29.600 --> 19:34.880] uh because nobody will and then you push out a release and suddenly oh well you broke my
[19:34.880 --> 19:43.920] application well how would we know so and so self-hosting uh do you ever have issues of
[19:43.920 --> 19:52.560] maybe fossil breaking its own repository um every now and then we'll have um we'll we'll you know
[19:53.600 --> 19:58.640] we'll be using fossil we'll find a performance inefficiency in SQLite that way which is a great
[19:58.640 --> 20:02.960] way to find them and fix them before they get out in an official release you know you mentioned
[20:02.960 --> 20:11.520] that a couple years ago uh we did have a repository go corrupt on us it was the official fossil
[20:11.520 --> 20:18.400] repository the self-hosting repository got a corrupt database and I said oh no what is
[20:18.400 --> 20:27.280] this about so we went and we looked and um it turns out that um s-tunnel which we're using for
[20:27.280 --> 20:38.320] to implement uh HTTPS uh was launching the fossil cgi leaving the uh the standard error
[20:38.320 --> 20:43.440] file descriptor file descriptor number two it wasn't it was leaving it closed and so then um
[20:44.960 --> 20:51.280] fossil would crank up SQLite and SQLite would then open its database using the first available
[20:51.280 --> 20:57.680] file descriptor which was now file descriptor number two and then there was some bug in
[20:57.680 --> 21:03.200] fossil and hit an assert and the assert then wrote the assert error message out on
[21:03.920 --> 21:10.880] file descriptor number two which was now pointing into the middle of the repository database and so
[21:10.880 --> 21:16.560] you know we looked at the corrupt database and saw an assert failed message in the middle of
[21:16.560 --> 21:22.160] this binary and so okay we know the problem now so we used that as an opportunity to it wasn't
[21:22.160 --> 21:26.960] really a bug in SQLite I guess you could say it was a bug in fossil it shouldn't have hit the assert
[21:26.960 --> 21:34.000] but still but we used it as an opportunity to improve SQLite SQLite is now careful to never
[21:34.800 --> 21:40.000] open a database file with a file descriptor less than three
[21:40.880 --> 21:41.520] um
[21:43.760 --> 21:49.440] that'd be one way to solve that yeah okay so I'm a heavy git user I've been involved with git since
[21:49.440 --> 21:54.240] the first month of the project uh been a contributor on one level or another on the mailing list for
[21:54.240 --> 22:00.160] years and and I still use it for every project I can choose give me give me three reasons
[22:00.880 --> 22:07.040] that uh I should change from git to fossil well you know if you're happy with git I'm happy for
[22:07.040 --> 22:13.360] you to keep using it honestly I mean really I wrote SQLite I mean I wrote fossil for SQLite
[22:13.360 --> 22:19.840] and if you find it useful that's great uh but I mean some people some people like I say there are
[22:19.840 --> 22:27.120] you run across people who for some reason or another just can't seem to get along if you're
[22:27.120 --> 22:33.440] part of the fun pun with git it just doesn't work for them I I know that you had to have run across
[22:33.440 --> 22:38.560] these people randall oh many yes and and what we find is that a lot of these people
[22:40.400 --> 22:45.680] they work better with fossil but now even if you're really happy with git and I'm glad that it's
[22:45.680 --> 22:52.800] working well for you I truly am I want you to take some time to look at fossil for a lot of the ideas
[22:52.800 --> 22:58.160] that are there because of a lot of the ideas that I have in fossil are not in git but I think that
[22:58.160 --> 23:05.280] git needs to steal them I need fossil is is bsd code git is gpl so you can just import the code
[23:05.280 --> 23:13.600] directly um steal my code steal my ideas and use them and make git a better product um
[23:15.440 --> 23:19.920] like what what would you what would you take from fossil in the git all right so fossil has this
[23:20.560 --> 23:29.680] all command you can say fossil all sync and fossil remembers all of the repositories that you have
[23:30.240 --> 23:36.960] on your login and and I typically have dozens or hundreds of active projects going on in fossil
[23:36.960 --> 23:42.080] and say you're on a lap or say I'm working on my my my ubuntu desktop right here which is where
[23:42.080 --> 23:46.880] I normally work and I'm getting ready to go on a trip and use this laptop that I'm talking to you on
[23:47.760 --> 23:53.600] over on my desktop I'll take fossil all push and that pushes all the repositories up to various
[23:53.600 --> 24:00.000] servers I have and then I go to my laptop and say fossil all pull and that pulls them all down
[24:00.000 --> 24:06.400] automatically all in one command and so then I go I get on the airplane I'm working I'm remote I make
[24:06.400 --> 24:11.200] some changes I get back to my office fossil all push it pushes them back up to the servers and
[24:11.200 --> 24:15.200] then I fossil all pull over on my desktop and everything's automatically synchronized I don't
[24:15.200 --> 24:19.360] have to go through and do this separately for every single repository that I'm working with
[24:20.000 --> 24:27.360] or at the end of the day I can say fossil all changes and that shows me all of the uncommitted
[24:27.360 --> 24:33.680] changes that I have on every single project that I'm working on and oh I forgot to do the commit on
[24:33.680 --> 24:37.920] this thing I was doing over here on this other project and it shows me right away so just the
[24:37.920 --> 24:44.320] all command is something that you could very quickly and easily add to git that would that
[24:44.320 --> 24:53.280] would enhance its value as sounds great sounds great yes yes go ahead we're almost out of time
[24:53.280 --> 24:56.080] so I want to make sure we get we had a couple more really interesting questions I want to make
[24:56.080 --> 25:03.200] sure we get asked before we uh before we run out of time uh so uh is there is there is there is
[25:03.200 --> 25:07.760] fossil already pre-built in the standard package servers like for debian and red hat and stuff or
[25:07.760 --> 25:14.000] can I can I just say apt get fossil and have it or and if not how do we get it I think there is
[25:14.400 --> 25:19.760] I think they are app they are pre-built in some of them they're older releases look just go to the
[25:19.760 --> 25:27.360] go to the fossil website and there's pre-built binaries for linux openbsd windows mac and and
[25:27.360 --> 25:32.960] there's a source tarball there just download it the source tarball and type um you know configure
[25:32.960 --> 25:38.160] make and it just builds um and and just get the latest and and that's the easiest thing to do it's
[25:38.160 --> 25:43.520] a it's a standalone binary it's very easy to install you just take this this one executable
[25:43.520 --> 25:49.120] and you put it on your path somewhere and it's installed it's not like get where you have how
[25:49.120 --> 25:56.080] many different executables is it now rental like 60 60 I think pretty close to that yeah and uh
[25:56.720 --> 26:01.760] okay lots of dependencies I mean fossil works in a changer jail all by itself there there are no
[26:01.760 --> 26:08.240] external dependencies well you know assuming you compile with minus minus um static but uh yeah it
[26:08.240 --> 26:12.560] it doesn't have any dependencies it it has everything you need so it's easy to install
[26:13.120 --> 26:16.720] that's wonderful and the other thing also Guillermo keeps whispering whispering in my ear
[26:16.720 --> 26:21.120] is there anything the equivalent of github as a hosted service if I don't want to actually
[26:21.120 --> 26:27.040] run it locally as a server yeah well first of all fossil makes it really easy to set up your own
[26:27.040 --> 26:32.480] little github service if you have a web server already going just it's a two line cgi script
[26:32.480 --> 26:38.880] but there is a a site out there called chisel ch I'll have to spell it for you I'll have to look
[26:38.880 --> 26:44.400] at the spelling for you and get it to you chisel.com that provides free hosting of fossil
[26:44.400 --> 26:48.640] repositories and there's they've got hundreds and hundreds of fossil repositories there
[26:48.640 --> 26:53.520] that people have put up well we could keep talking for another hour there's so many other things I
[26:53.520 --> 26:57.280] want to ask you but is there anything we haven't covered you want to make sure our audience is
[26:57.280 --> 27:04.480] aware of before we have to wrap up uh no I my point about you know the the git users just look
[27:04.480 --> 27:09.600] at it and get the ideas and steal my code really I've got no vested interest in this I wrote
[27:09.600 --> 27:14.160] fossil specifically for sqli and if it's never used for anything else other than that it has
[27:14.160 --> 27:18.560] served its purpose but if people can get some ideas and improve git from it I think that would be great
[27:18.560 --> 27:25.200] or maybe this is a better solution for you just give it a try sounds wonderful and I have to ask
[27:25.200 --> 27:29.040] my two standard questions because otherwise my audience will yell at me they'll send me email
[27:29.040 --> 27:32.720] tomorrow saying why did you ask the two standard questions so what's your favorite scripting
[27:32.720 --> 27:38.080] language I actually may even know this but go ahead well uh I'll have to say tickle tk because
[27:39.280 --> 27:45.200] yeah yeah definitely definitely and and it's quite nice that you said tk because I think tk
[27:45.200 --> 27:51.280] and what was the other thing the thing that uh can can um automatically script something uh run
[27:51.280 --> 28:00.480] commands and uh uh don lodge expect tickle no expect yes expect and tk put tickle on the map
[28:00.560 --> 28:04.320] I think without those two things we might not have ever heard of tickle so uh glad that both
[28:04.320 --> 28:10.560] of those exist and uh your favorite text editor oh I I wrote my own of course
[28:12.720 --> 28:16.560] it's the emacs bindings emacs bindings is typically what I do yeah
[28:18.240 --> 28:21.360] dr hip is there anything you haven't written of your own that
[28:21.360 --> 28:29.520] and forked in your own thing yeah a few things I really um I really need to write a good email
[28:29.520 --> 28:37.040] server I haven't gotten to that yet and then we'll bring you back eight years from now you'll talk
[28:37.040 --> 28:44.320] about this new there you have your own copy of linux you got a forked version of that too or
[28:44.320 --> 28:49.680] I used to do that I used to build my own hardware and and compile my own kernels and and all of
[28:49.680 --> 28:55.120] that but I've gotten lazy as I've gotten older and and and I I I buy pre-built machines that
[28:55.120 --> 28:59.920] come with Ubuntu pre-installed and they arrive with the root password taped to the box and I
[28:59.920 --> 29:06.720] just plug them in and use them so is the is the password uh root by any chance no
[29:10.160 --> 29:14.080] I'm surprised you don't have your own version of the raspberry pi or the arduino now too
[29:14.880 --> 29:21.680] well I know I don't have my origin I do use um I do use um uh a beagle board over here
[29:21.680 --> 29:27.840] for testing sqlite on arm but um no I haven't built my own
[29:30.400 --> 29:33.840] well it's been a real pleasure having you back on the show we'll bring you back about every
[29:33.840 --> 29:39.040] eight years and talk about whatever you've done next this has been a pleasure sir thank you for
[29:39.040 --> 29:44.480] being on the show it's good talking to you very good that was uh Richard Hipp the
[29:44.480 --> 29:51.440] reinventer of the world uh what do you think there Guillermo well any man that writes his own
[29:51.440 --> 29:59.840] text editor is you know right up there yeah yeah he's he's a he's a very interesting guy
[30:00.800 --> 30:05.760] yes yes I'm very happy to have him back um so fossil is interesting I might actually have to
[30:05.760 --> 30:09.120] check this out I don't uh you know like I said I'm a pretty heavy git user but
[30:09.680 --> 30:14.240] fossil may have some really interesting things that might work for some of the people who from
[30:14.240 --> 30:19.600] git sometimes gets a little complex I know that I've gone into um many many organizations as a
[30:19.600 --> 30:26.240] consultant and if they're using git there's almost always like about one new piece of mail
[30:26.240 --> 30:31.360] every week in the sort of the developer mailing list that says hey guess what git can do this too
[30:31.360 --> 30:35.760] and it's always surprising how many things I'm even learning from the exchanges going on there
[30:35.760 --> 30:41.040] and I'm usually also the source of some of those as well um but it sounds like fossil is is good
[30:41.040 --> 30:48.000] for what it's designed for and I do also appreciate the uh the built-in wiki and web server and um
[30:48.960 --> 30:53.920] the uh the bug tracker because I know that integrating those at some of the locations
[30:53.920 --> 30:59.840] I've been at has just been insane with git uh so I may actually uh see if there's opportunities
[30:59.840 --> 31:05.840] in the upcoming for for fossil to be deployed um you know I'm hoping that there's a mac port of
[31:05.840 --> 31:10.000] it automatically or just you know an import install or whatever but if not it sounds like
[31:10.000 --> 31:16.400] it's just a simple source file or two to compile down and uh we'll see how that all works anything
[31:16.400 --> 31:24.320] else uh interesting there well um I I'm probably gonna uh give it a you know good old try because
[31:24.400 --> 31:28.880] I as you mentioned before having a bug tracker and everything else with uh
[31:29.520 --> 31:35.360] with a git is very very hard to you know actually get it working correctly and then you have to do
[31:35.360 --> 31:40.800] all these you know special uh special commands like git push for something master branch or
[31:40.800 --> 31:46.480] whatever and yeah it just gets really silly at times so I'm probably just gonna give it a uh
[31:46.480 --> 31:50.880] you know the old college try and see if that if that actually uh you know fits for any of my
[31:50.880 --> 31:56.640] projects yeah sounds great sounds great well great so um we don't have a lot of the upcoming
[31:56.640 --> 32:01.520] guest list I have sent out I think something like 30 pieces of email try to fill q1 already
[32:01.520 --> 32:05.680] we do have a couple of people who are almost certainly going to happen and one of them may
[32:05.680 --> 32:13.040] even be next week um the marpa project which is a fascinating project to me uh marpa is a pearl
[32:13.040 --> 32:20.080] implementation of the pearl plus c implementation of the early parsley e a r l e y not just early
[32:20.080 --> 32:24.800] in the morning well that's just this early in the morning right now um the early parser is a
[32:24.800 --> 32:31.040] fascinating one in that it can deal with ambiguous grammars giving you all possible parsings if it
[32:31.040 --> 32:35.520] ends up being ambiguous at the end it sort of parses them all the possible limitations or
[32:35.520 --> 32:41.440] possible parsings at once so my friend jeffrey kegler took this and built a pearl implementation
[32:41.440 --> 32:46.080] of that but one of the two things that uh or there's two things that early didn't do very well and
[32:46.080 --> 32:50.080] that was left recursion I believe we're right recursion the left recursion I think it is
[32:50.080 --> 32:55.280] and empty production rules on the right so uh jeffrey figured out a way using somebody else's
[32:55.280 --> 33:00.960] paper we're talking about uh the early parser implemented that in pearl so we now have the
[33:00.960 --> 33:07.520] fastest most comprehensive parser and lecture system available in the world is now written
[33:07.520 --> 33:12.800] in pearl and I wish other people would copy it so I could use another languages but uh uh
[33:12.880 --> 33:17.120] jeffrey himself is not coming on but he's his head spokesman for the marpa project is coming on to
[33:17.120 --> 33:21.520] talk and I believe that's going to be next week uh the docker people have talked have emailed me
[33:21.520 --> 33:26.880] again and said we will have docker on the show uh so I'm hoping that that's going to be coming up
[33:26.880 --> 33:31.360] in the next couple weeks as well we're just waiting for uh yeah right we're just waiting for uh uh him
[33:31.360 --> 33:36.080] to uh to get the date knocked down again a lot of other people on the short list a lot of emails
[33:36.080 --> 33:39.520] flew out and because it's during holidays and people don't respond very quickly in the holidays
[33:39.520 --> 33:44.240] but if you go to twitter tv slash floss which is the home page for the show you'll see our big list
[33:44.240 --> 33:50.080] link from there um and if there's some project that you want on this show and it's not listed
[33:50.080 --> 33:54.640] there please have the project leader email me merlin at stonehenge.com and I will try to get
[33:54.640 --> 33:59.600] them on as quick as possible lots of empty slots in this part of the uh the year right now so um
[34:00.240 --> 34:04.800] we have a live chat with a couple questions from there that's at live.twit.tv at 8 30 a.m pacific
[34:04.800 --> 34:10.240] time on wednesdays mostly occasionally type tape out of other sequence but mostly it's coming on
[34:10.240 --> 34:13.520] there and so if you come there you can watch the show while it's being taped live see the behind
[34:13.520 --> 34:18.240] the scenes stuff and also get your questions brought in to the show uh like just as if you
[34:18.240 --> 34:23.840] were sitting here on one of our mics very cool uh you can follow me merlin m-e-r-l-y-n on twitter
[34:23.840 --> 34:28.960] i'm also on google plus as randall l schwarz i post there frequently about things including my
[34:28.960 --> 34:34.400] new way of eating my low carb high fat ketogenic dieting lots of comments about that um
[34:34.960 --> 34:39.600] i just want to say new year's eve at the brick house if you didn't see it i think almost all of
[34:39.600 --> 34:45.120] it was recorded and it's now up on the uh this live stream not the live stream what they call it
[34:45.120 --> 34:52.800] the uh the live specials feed on the twit network go check that out uh i did a few things i did a
[34:52.800 --> 35:00.400] nice round table with um renee richie uh the windows guy uh and i think well so many other
[35:00.400 --> 35:04.320] four of us i can't remember what i don't watch their show sorry sorry guys i don't watch your
[35:04.320 --> 35:09.440] shows i think you watch mine though so hi there but i'm sorry i can't remember his name um that
[35:09.440 --> 35:14.480] was like a good 30 minute discussion we got into things like um like the recent security breaches
[35:14.480 --> 35:18.560] and edward snowed and a bunch of other really good stuff i'm kind of hoping we can do that probably
[35:18.560 --> 35:21.760] you know every six months or maybe every three months or something i'd be really oh steve
[35:21.760 --> 35:26.000] gibson right that's right sorry thanks thanks chat room yes steve gibson sorry i completely
[35:26.000 --> 35:31.360] i completely forget my arch nemesis occasionally so um it's uh paul thoreau and renee richie there
[35:31.360 --> 35:34.640] we go that was the other three people besides me uh hopefully we get that little round table
[35:34.640 --> 35:40.080] going again uh and uh erin and nukem and i did some stuff on uh gadgets there joeyno uh that
[35:40.080 --> 35:46.720] he has and raspberry pie um i also trolled the uh the audience we didn't have anybody for the
[35:46.720 --> 35:53.760] hour that kazakhstan had their um had their uh their uh new year's eve and so i got them to play
[35:53.760 --> 36:01.520] the uh borat uh kazakhstan anthem for that hour so that was great yes so we got that we got that
[36:01.520 --> 36:05.600] to happen that was that was my troll for the day and i actually popped my head in a few other things
[36:05.600 --> 36:11.280] as well so it was it was a lot of fun i managed to make it 14 hours uh leo did a full 24 hours
[36:11.280 --> 36:18.800] leo got his head shaven he got a tattoo of a twit logo on his on his tiny there uh it was just great
[36:18.800 --> 36:22.480] and most of that like i said is in the stream already so you can watch that uh in the uh in
[36:22.480 --> 36:27.760] the playback uh i'm going to be in cuba in a few weeks uh so i won't be hosting the show i've got
[36:27.760 --> 36:32.720] a suitable guest host as i often do when i have to go away um and i'm also for those of you in
[36:32.720 --> 36:38.640] the la area i will be at scale in february at the hilton hotel i think it's february 22nd through
[36:38.640 --> 36:45.600] 24th or something like that um so it'll be great um oh wait no jeff charvis uh not uh not the other
[36:45.600 --> 36:49.680] guys jeff charvis was it not paul farrell right yes that's right jeff charvis uh who actually got
[36:49.680 --> 36:55.600] his head or in his beard shaven uh there was various goals for raising money for the unicef
[36:55.600 --> 37:00.480] and uh and as the goals kept getting hit weirder things kept happening during the day so if he
[37:00.480 --> 37:04.000] i can say if you haven't checked that out go check that out a lot of fun i hope i can do it next year
[37:04.000 --> 37:07.040] um that's all i want to plug right now anything you want to plug your germo
[37:07.680 --> 37:14.560] uh well i guess uh people can find me and um on twitter that's uh at g a g a m a r a l
[37:14.640 --> 37:19.040] never write my own name but at least not spell it and uh i'm gonna restart my
[37:19.040 --> 37:25.200] youtube channel uh this week now that i'm out of college that means extra time so uh expect
[37:25.200 --> 37:31.840] podcasts and expect uh some uh videos out there soon that's pretty much it i didn't do anything
[37:31.840 --> 37:38.480] fancy in new years besides you know eat and drink or anything and you'll be at scale right
[37:38.480 --> 37:45.040] don't usually yeah yeah i'll be at scale i i was supposed to uh submit a talk but i never actually
[37:45.040 --> 37:50.560] got i got to it but i'll be there you know just mingling around and saying hi to people so i'll
[37:50.560 --> 37:54.720] be around yeah well you know we do have an inside connection to there so maybe you can still submit
[37:54.720 --> 38:01.920] the talk late and still get it on oh maybe i'll see we'll get gareth back on and he'll just
[38:01.920 --> 38:06.080] automatically approve your talk whatever it is so uh but a great show unfortunately we're out of
[38:06.080 --> 38:17.200] time so we'll see you all again next week on floss weekly