[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