I’ll be playing EXAPUNKS, and/or catching up on sleep.
I played a decent amount of this in one night this week so far (staying away from it the other nights in an attempt to keep from losing too much sleep).
I really enjoy the effort that went into the setting, and have been finding all the “File Processing” puzzles quite interesting, as that sort of data processing is something I’ve done a fair amount, just not one word at a time.
@SirCmpwn posted an example of what a small window compositor could look like in Wayland https://gist.github.com/SirCmpwn/ae4d1cdcca97ffeb2c35f0878d75dc17
(Some commentary added at https://news.ycombinator.com/item?id=17774889 to explain why wlroots is used in the small wayland compositor)
I recently wrote a blog article on factor, and I’m looking forward to playing EXAPUNKS.
I have 3 websites where I publish technical thoughts. My primary blog is Jungle Coder, which is roughly 75% technical and 25% personal. I use Andy Rambles on other occasions, that’s 95% technical, usually around video game related stuff, or things that are more intensely technical. Both of those sites have RSS feeds. Finally, I have a wiki for lists and less polished thoughts at https://idea.junglecoder.com which doesn’t have an RSS feed as of yet (it’s on the list of things I’d like to add to the software, but cobbler’s kids and all), but does arrange the articles from most recently changed to least recently changed.
The built in peg parsing library in factor is super impressive. The tiny C compiler builds a stack while parsing C code and pops it to emit code, since the stack is already there implicitly with factor, I wonder how terse a super tiny C compiler could be written in factor.
I haven’t played with the PEG parser in Facctor yet, hearing this intrigues me a bit, however.
There is already an implicit stack in factor, but because it does duty as being where the parameters live, it might be a little tricky to use in the way that the Tiny C compiler uses it (I haven’t checked the tcc, so I don’t know for sure), if there’s any off-stack state (though factor does have globals and dynamic/lexical variables that could also be used).
Thinking more, you are definitely right that it may be super awkward to do anything tricky, but the code embedded in a peg parser would still help make things compact.
It’s worth pointing out that there’s other CLI clients for slack: Weechat has weeslack, for example.
I gotta say, the screenshots on this one look pretty impressive, however.
I’m not as involved as I used to be, but I’m still on the core team, so feel free to ask me questions if you’ve got any.
Would you recommend Factor for production use given that it seems to be reaching a sort of plateau in support and community?
It’s a beautiful language, by the way. Thank you for your work.
I have Factor running in production. Although I don’t really maintain the web app much - it just ticks along - Factor runs tinyvid.tv and has for the past few years. I originally wrote it to test HTML 5 video implementations in browsers back when I worked on the Firefox implementation of video.
As always, it depends on what you’re doing—I’d definitely be nervous if you told me you were shoving Factor into an automobile, for example—but Factor the VM and Factor the language are both quite stable and reliable. On top of doublec’s comment, the main Factor website runs Factor (and its code is distributed as part of Factor itself for your perusal), and it’s been quite stable. (We do occasionally have to log in and kick either Factor or nginx, but it’s more common that the box needs to be rebooted for kernel updates.) I likewise ran most of my own stuff on Factor for a very long time, including some…maybe not mission-critical, but mission-important internal tooling at Fog Creek. And finally, we know others in the community who are building real-world things with Factor, including a backup/mirroring tool which I believe is being written for commercial sale.
The two main pain-points I tend to hit when using Factor in prod are that I need a vocabulary no one has written, or that I need to take an existing vocabulary in a new direction and have to fix/extend it myself. Examples are our previous lack of libsodium bindings (since added by another contributor) and our ORM lacking foreign key support (not a huge deal, just annoying). Both of these classes of issues are increasingly rare, but if you live in a world where everything’s just a dependency away, you’ll need to be ready for a bit of a change.
You can take a look at our current vocab list if you’re curious whether either of the above issues would impact anything in particular you have in mind.
What would you say is Factor’s best application domain, the kind of problem it solves best? I met Slava many years ago when he was presenting early versions of Factor to a local Lisp UG, and am curious to see where the language fits now, both in theory and practice.
My non-breezy answer is “anything you enjoy using it for.” There are vocabularies for all kinds of things, ranging from 3D sound to web servers to building GUIs to command-line scripts to encryption libraries to dozens of other things. Most of those were written because people were trying to do something that needed a library, so they wrote one. I think the breadth of subjects covered speaks well to the flexibility of the language.
That all said, there are two main areas where I think Factor really excels. The first is when I’m not really sure how to approach something. Factor’s interactive development environment is right up there with Smalltalk and the better Common Lisps, so it’s absolutely wonderful for exploring systems, poking around, and iterating on various approaches until you find one that actually seems to fit the problem domain. In that capacity, I frequently use it for reverse-engineering/working with binary data streams, exploring web APIs, playing with new data structures/exploring what high-level design seems likely to yield good real-world performance, and so on.
The second area I think Factor excels is DSLs. Factor’s syntax is almost ridiculously flexible, to the point that we’ve chatted on and off about making the syntax extension points a bit more uniform. (I believe this branch is the current experimental dive in that direction.) But that flexibility means that you can trivially extend the language to handle whatever you need to. Two silly/extreme examples of that would be Smalltalk and our deprecated alternative Lisp syntax (both done as libraries!), but two real examples would be regular expressions, which are done as just a normal library, despite having full syntax support, or strongly typed Factor, which again is done at the library level, not the language level. I have some code lying around somewhere where I needed to draft up an elaborate state machine, and I quickly realized the best path forward was to write a little DSL so I could just describe the state machine directly. So that’s exactly what I did. Lisps can do that, but few other languages can.
Were native threads added in this release, or are there plans to? And did anything ever come to fruition with the tree shaker that Slava was working on way back when?
Major props on the release. It’s really nice to see the language survive Slava disappearing into Google.
The threads are still green threads, if that’s what you’re asking, but we’ve got a really solid IPC story (around mailboxes, pattern matching, Erlang-style message passing, etc.), so it’s not a big deal to fire up a VM per meaningful parallel task and kick objects back and forth when you genuinely need to.
In terms of future directions, I don’t know we’ve got anything concrete. What I’d like to do is to make sure the VM is reentrant, allow launching multiple VMs in the same address space, and then make the IPC style more efficient. That’d make it a lot easier to keep multithreaded code safe while allowing real use of multiple cores. But that’s just an idea right now; we’ve not done anything concrete that direction, as far as I know.
Really off-topic, but isn’t Slava at Apple?
He is now. Works on Swift.
Where does the core factor team typically communicate these days? #concatenative on freenode seems kinda dead these days. Is there a mailing list, or on the yahoo group?
This weekend, I decided to buckle down and try to learn some Factor, and ended up writing a 4-function calculator as an exercise in learning the GUI system.
It went better than the last time I tried to learn factor (which lead to me creating PISC). I think I could use factor for some things going forward. With the right set of additions, I could see it’s GUI system being about as expressive as TCL’s tk, but it takes a lot of getting used to due to the lack of examples. Thankfully, you can muddle through the documents to learn things, and most things are documented somewhere, but where isn’t always obvious, and google is of minimal help.Still, there’s a lot there to work with.
I’ll have to give factor another spin. I previously bounced off of it in favor of making my own stack-based language, since I was very interested in writing any sort of programming language at the time (and getting started on a stack based language seems easy, even though the long work of getting it to a good quality still takes a long time). Factor definitely influenced my early designs in that project, but I’d be interested in revisiting it with I now know about various things.
I’m in my favorite job of my career so far, doing my best ever work. I had a very reasonable interview loop without a single trivia question. It’s the first time I got referred in by a friend and ex-coworker, through a network of his friends.
My new rule of thumb for myself is, when possible, work with my friends or their friends. Referrals referrals. Find people you like to work with and stick together. The only way to know if somebody can solve real problems for a real company (with warts and all) is by actually being in the trenches with them for months and years.
Working only with friends and friends of friends seems wrong to me. The words that come to mind are exclusive and cliquish. To get diverse perspectives and live up to the ideal of equal-opportunity employment, we need to be comfortable working with strangers.
Traveling between companies as a group of friends doesn’t mean that you’re only working with said friends, since there will almost always be other co-workers involved, but that you’re working with more known quantities. As an employee-side strategy, I don’t think it’s hugely problematic, especially given the amount of information asymmetry that’s often in play in hiring. I’ve also had luck with referrals (I’ve found out about 3 out 4 of my development jobs via some sort of reference or connection, including my current one).
On the employer side, I could see only working with referrals being somewhat problematic, but I doubt most employers do that.
I mean, my friend’s friend who I am now working for is roughly 3000 miles away from where I met my friend. I was definitely exposed to diverse perspectives by moving out here, and I necessarily have to interact and learn from all of my new coworkers (who are all diverse strangers to me). What I gained was a pre-selection stamp; somebody vouched that I’m not an idiot.
It’s also bi-directional preselection. I know that my friend wouldn’t send me off to work for a real dumpster fire of a company - I know that I’ll be working with good people on good projects, and it would benefit my own personal growth.
Friend networks can span multiple cities, countries, companies, and cultures. It doesn’t have to imply inbreeding.
The words that come to mind are exclusive and cliquish.
The words that come to mind are exclusive and cliquish.
This sounds fun in practice until you hire a terrible stranger. Then you’re back to square one of “how do you find out if an interview candidate is good?” And it’s a hard question.
KeePass has clients that work the 3 operation systems in question, and I’ve had good luck using Syncthing to share the password file between computers, but the encryption of the database means that any good sync utility can work with it.
I KeePassX together with SyncThing on multiple Ubuntus and Androids for two years now. By now I have three duplicate conflict files which I keep around because I have no idea what the difference between the files is. Once I had to retrieve a password from such conflict file as it was missing in the main one.
Not perfect, but works.
Duclare, using ssh instead of SyncThing would certainly work since the database is just a file. I prefer SyncThing because of convenience.
Duclare, using ssh instead of SyncThing would certainly work since the database is just a file.
Duclare, using ssh instead of SyncThing would certainly work since the database is just a file.
Ideally it’d be automated and integrated into the password manager though. Keepass2android does support it, but it does not support passwordless login and don’t recall it ever showing me the server’s fingerprint and asking if that’s OK. So it’s automatically logging in with a password to a host run by who knows. Terribly insecure.
I had the same situation. 3 conflict files and merging is a pain. I’ve switched to Pass instead now.
I use Keepass for a few years now too. I tried other Password managers in the meantime but I never got quite satisfied, not even pass though that one was just straight up annoying.
I’ve had a few conflicts over the years but usually Nextcloud is rather good at avoiding conflicts here and KPXC handles it very well. I think Syncthing might casue more problems as someone else noted, since nodes might take a while to sync up.
Away from work, I’ve started on a (very WIP) set of documentation for PISC, which has involved:
Having these documents built from my Go/PISC source code has demonstrated how poorly a good chunk of the PISC code is documented. Having basic access to the same documents at the command line (names and function signatures) has proved surprisingly useful, reducing the amount of “And I have two code windows open” going on by a lot. I’m considering trying to write a sort of command-line documentation generator for C# that works in a similar fashion, just to have easy access to function/method signatures. Intellisense provides this to some extent, but having this might make it easier to not depend on Intellisense.
At work, getting ready to be on maintenance for a couple weeks, which should be nice.
For those intrigued by HyperCard, there is a modern day descendant that is able to produce standalone software for macs, windows, linux, iOS and Android called LiveCode. It is a joy to use, specially when you’re just building tools for your personal use, more focused in solving your own problems than building the next unicorn thing. Nothing is faster, IMHO, than dragging and droping a bunch of controls, writing some glue script, and scratching some itch. It can (and is) used to ship real products in all platforms. I think it shines in Desktop cross-platform development and for internal tools, those are my preferred use-cases for it.
It looks great to me. Pricey though, and very clearly targeted at devs. The partially unrealised beauty of Hypercard was anyone could use it, and making Stacks didn’t feel like you were making software.
You can actually have it for free. They have an open source GPL version at https://livecode.org/, it is targeted at professional developers but I know a ton of non-developers using it (I used to be a quite active member of their community) and techers in K12 space using it as well so you can still have that feeling of using stacks in HC.
I’m curious as to what you’ve built with this (just to get an idea of what the sorts of itch-scratching things are easily done with this)
I always use it when I need to transform data for some other stuff I am doing, or to scrape stuff for personal use, or to do some form of batch processing.
A recent example, I was building a little API backend server for a project that is not related to LiveCode, just normal web stuff. It was easier for me to cook up a little stack with buttons, fields and some diagnostics and debug my little server while I was building it than use those generic tools such as insomnia.
Those generic tools are awesome, pretty and powerful, but my own handmade tools, which I create specifically to a given project have the advantage of being tailored to whatever I am building, so they might be ugly but they are my special-purpose tools that help me develop and debug my own projects. There is a lot of developer ergonomics when you can quickly come up with GUI tools to debug whatever you’re doing.
Another example is when I had to do some complex batch renaming of thousand of files. The process involved a little crawler going on disk into the folders, inspecting some configuration files relative to the folders and renaming stuff inside them. I could do this with visual feedback, progress bars, etc…
I am quite bad at design but I am scratching my itches, not selling itch scratchers. My little stacks help me a lot.
So is LiveCode a project of your own then?
No, it is not. I am just one of its users.
[Comment removed by author]
What the hell, @rain1.
Find something kinder to do with your time.
Bringing other people down while adding nothing to the conversation isn’t something we need here.
I’ve used a few different keyboards, but nothing too fancy.
I like using low travel keyboards, so most laptop keyboards work nicely for me. When not using a laptop keyboard (my work machine is a Dell Precision 5520), I alternate between a Kinesis Freestyle (so nice for packing and taking places), an MS Ergonomic 4000 (sometimes referred to as “The Camel” by my friends), and Microsoft Mobile Bluetooth 5000 keyboard.
I’ve tried a Kinesis Advantage, but it transfers what is normally minor knuckle pain into my wrists, being too narrow for my shoulders.
I typically don’t customize the keyboard itself, I’ll occasionally remap capslock to control, but is hasn’t happened much lately.
I find that a some variety seems to help with keyboards.
I’m settling into my apartment, and also working away at building out another erlang web site based on this idea, though I’m currently not sure what to name the thing.
At work, currently on sprint, which has gone well this time around.
Another day, another this could totally happen to anyone but just happened to hit npm story.
True enough, although npm does happen to be in a place of significant usage/consequence in the current web ecosystem.
Would the scale have been the same though? This particular package is pretty popular by itself, but I’d bet a big chunk of its 2M+ weekly downloads comes from the fact that it’s a dependency for popular packages such as babel and webpack. Why on earth would I need to download a linter in order to run babel? What kind of dependency tree is that?
Even if you try to keep your dependencies as slim as possible, it’s absolutely unreasonable to expect to be able to audit the thousands of dependencies a single dependency may have, with all of them having the same permissions as the code I write to run arbitrary code on my machine. Are these really possible elsewhere?
The resolution for this looks like it’s still ongoing (at least that thread is active), I’d ask that people here don’t put their oar in that thread until they’re able to get this sorted out.
Scary how often viruses like this are showing up in linux! I think this is the beginning of a new time.. and we’re going to have to change the way we do things to stay safe.
These incidents (at least in the NPM context) are good endorsements for the goals of Ryan Dahl’s deno, which runs code sandboxed by default.
sandboxing is good but i don’t want to run malicious code at all, even if it’s properly contained! We need better review too.
I’d go a little bit further than that. We need to extend the security architecture of our package managers. For example, architectures like TUF, notary/Docker Content Trust, or PEP-458 are great starting points.
This is more of an NPM virus, not a linux specific one.
@SirCpmwn, how did you land on the name/domain sr.ht for this?
I saw it was available years ago and bought it before I knew what I would do with it.