« first day (2608 days earlier)      last day (2235 days later) » 

12:59 AM
@J.Sallé About that... it would not run either without downloading itself. If the third-party application is too heavy then it's indeed a problem.
 
@user202729 but it can only run if you downloaded it...
 
"itself being downloaded".
 
@user202729 hmm?
 
1:22 AM
Infinite loop here, right??
 
guys what is your opinion on this?
in rust this is a lambda printing an argument x:
|x|println!("{}",x)
but
this does not compile!
λ ~/programming/rust/experiments/ master cargo run
   Compiling experiments v0.1.0 (file:///home/orlp/programming/rust/experiments)
error[E0282]: type annotations needed
 --> src/main.rs:2:6
  |
2 |     |n| println!("{}", n);
  |      ^ consider giving this closure parameter a type
however, if you also try to use the lambda function:
(|x| println!("{}", x))(5);
it compiles, because now rust can infer the type of x in the lambda function
so, should |x|println!("{}",x) be allowed as an answer?
 
what the frick rust
 
Can't it infer a parametric type?
Just curious
 
Of course yes.
(wait a minute let me find relevant meta about Haskell)
 
The typical usage of a lambda would look like f=lambda something then calling f(x) so it looks fine to me as long as the compiler can recognize the full program
 
Anonymous
1:36 AM
@orlp I think so. We allow lambda x:x.foo() in Python, which only works if x has a foo method, so it's not really any different other than the fact that it doesn't compile without the call to disambiguate.
 
@orlp yes. C# and Java answers do this too
 
@user202729 thanks
@Bubbler Rust has no parametric types
it has... 'deferred' types where the type of something is unknown but will become known later
 
@DestructibleLemon IDK how to do that (whatever that is), as I've studied Rust a bit, but I'm a bit RUSTy on it. And I'm done for today.
 
so you can do this:
 
1:42 AM
Isn't that the same as parametric?
 
let f = |x| x*x; f(3);
but you can not do this
let f = |x| x*x; f(3); f("oops");
 
AHH! It's auto, isn't it?
 
the second should work if f is using parametric typing
but it's not
it's just that on first usage it infers the type of the parameter
sort of like auto but more powerful
for example you can also do this
let mut v = Vec::new(); v.push("test");
note that I never specified the type of v
I just initialized it as a Vec of unknown type
but it goes beyond that
Rust didn't know what type v contains
it only found that out when I pushed to it
 
Does it have something that's just like auto?
 
@orlp I think part of it is that you should be able to reuse it. This is the case in the linked Haskell post
 
1:44 AM
@H.PWiz you can reuse it but only with a single type
you can't use it with one type then with another type
it's still a typed function with one input type
 
That is fine in my book
 
it just wasn't specified what that one input type is when the function was written
@Zacharý define 'just like auto'
I can do let x: u32 = 5; let x2: u32 = x+x;
or I can let rust figure that out
 
Where the input type can vary.
 
let x = 5u32; let x2 = x + x;
@Zacharý do you mean templates?
 
Yes
 
1:49 AM
@Zacharý well, rust has Generics
instead of saying template<class T> T f(T x) { return x*x; }
in rust you can't say "take any type"
or well you can, but then you can't do anything useful with it
 
Example?
 
fn f<T: Mul<T, T>>(x: T) -> T { x * x; }
in Rust you specify that you take something that implements the Mul trait
now you can multiply it
 
that really looks like Haskell
 
do you also want to add with it?
fn f<T: Mul<T, T> + Add<T,T>>(x: T) -> T { x * x + x }
oh apparently it's just Mul<T> now
but if I try to add without adding the Add trait:
use std::ops::Mul;
fn f<T: Mul<T>>(x: T) -> T { x * x + x }
error[E0369]: binary operation `+` cannot be applied to type `<T as std::ops::Mul>::Output`
 --> src/main.rs:2:30
  |
2 | fn f<T: Mul<T>>(x: T) -> T { x * x + x }
  |                              ^^^^^^^^^
  |
  = note: an implementation of `std::ops::Add` might be missing for `<T as std::ops::Mul>::Output`
it complains that you can't do that unless you specify it
that might sound tedious, and it is a bit
but in the long run it's a lot better than C++
where it's "just pass in the type and see if the function body compiles or not, yolo"
 
so you don't have something like Numeric that encompasses Mul, Add and the like?
 
1:56 AM
there's a library for that :)
Rust has a very good package system so a lot of things are painless to use from libraries
you can also implement your own traits
 
@orlp List operations generally don't care about what features the contents implement, so that's generally where "any type" generics are used.
 
Nice then
 
so for example HasDebug
fn f<T: HasDebug>(x: T) { x.debug(); }
 
C# should really have traits
 
@ASCII-only They're called interfaces
 
2:14 AM
What would be a difference between the two?
 
The name
 
@Pavel no...
 
Yes it is
 
no?
interfaces can't have method implementations?
 
Default methods for interfaces
You can have them in Java and soon in C# 8
 
2:18 AM
@Pavel yeah but not yet
 
Ah, so methods with a body?
 
sadly
 
Or like abstract classes, except you can implement multiple
So like C++ abstract classes
 
yeah
 
So abstract class <approx-eq> interface?
 
2:19 AM
Yes
Really nothing new
 
<approx-eq> trait
 
Traditionally interfaces can't define method bodies at all, but that kinda got lost somewhere along the way.
 
2:31 AM
I wish Java would go even further and let you define methods that couldn't be overridden in an interface
That way, the only distinction between a class and an interface is storage of data
 
@NathanMerrill Or allow interfaces to require static fields and methods in all implementing classes...
 
nah, I don't agree with that. I wanted that a while ago, but it fundamentally doesn't make sense.
like, if I call A.someMethod()
 
Yeah
For generic A
 
which gets called, the A version, or the B version?
(where B implements A)
what if B and C both implement A?
anyways, I found that the reason I wanted it was for something like T.new() (where T is a generic)
but I've found that simply passing in a Supplier<T> makes that easier
 
My thinking: I have interface Number and class Vector<N extends Number>. In the dotProduct method, I need a zero; what if I can use the zero I know to be defined as a static field in whatever N is? This would be nice.
The accepted solution is okay, but not as elegant as just using N.ZERO (analogous to your T.new())
 
2:40 AM
ok...so for this to work:
we'd have to no longer erase generics
because we can't resolve the method until runtime
ok, try this out for size
 
Ah. I see.
 
Class A extends Number
Class B extends A
Class C extends A
void <T extends Number> getZero(List<T> list){
}
what if I pass in a list of Bs and Cs
what is T.ZERO?
(the list I'm passing in is declared as List<A>)
is it A.ZERO?
 
I'd think A.ZERO
 
that's not useful if I'm trying to combine that with a B or a C
you were trying to get the 0 for the appropriate class
 
well of course
but you're trying to get the zero for a list with multiple types
which doesn't make sense
 
2:45 AM
right, but who says that Complex doesn't have other people inheriting from it?
when you pass in a complex, it doesn't have to be a complex number, it could be a MegaComplex number
 
@NathanMerrill what do you mean
 
6
Q: Access static field of generic type

ScroobleCan I require classes implementing an interface to have a certain static field or method and access/invoke that field or method through a generic type argument? I have an interface, Arithmetical<T>, which specifies several functions like T plus(T o) and T times(T o). I have as well a Vector<N ex...

This is where Complex is coming from.
@NathanMerrill But those subclasses wouls still implement Arithmetical<Complex>, right? So Complex.ZERO would still be of use?
<-- Java newbie
 
I mean, maybe?
what happens if I pass in a list declared as List<? extends Number>
and Number (because its the base level interface) doesn't have an implementation of ZERO
what is T.ZERO then?
 
@Scrooble what if they have more properties that need to have a zero value too
 
anyways, the solution you really want is C# defaults
because you can define great defaults if you use a struct, not a class
 
2:54 AM
@NathanMerrill So my friend always tells me...
 
3:14 AM
@NathanMerrill That's what I wasn't getting before. Thanks.
 
yep :)
 
@ASCII-only Those subclasses' properties would only be important when dealing with other subclass instances, as in Vector<MegaComplex>; for that, MegaComplex.ZERO would be used, as desired.
I think.
Anyway, 'night.
 
@NathanMerrill I'm pretty sure only Java does type erasure
 
Anyone have opinions on runtime errors?
 
C# does meta-classes, which are like templates but with less cancerous error messages.
 
3:24 AM
Implementing those in VSL rn
 
I'm sure there's another language out there that also erases types
but yeah, I agree
Java's the only major one
 
Also all the JVM based ones obviously
 
not necessarily
 
Well most of them
 
it depends on what your base object is
like, you can opt to add meta information to all objects in your language
(that gets messy with Java interop)
 
3:26 AM
One of the things that's a bit wierd in C# is how generic covariance and contravarience works
For predefined types like Lists is just kinda works and I don't question it but for user-defined classes I get really lost
 
@Pavel why though
 
Like how you can't assign a List<Square> to a List<Rectangle> variable, but you can assign a List<Quadrilateral> to a List<Rectangle> variable.
When you define your own Foo<T>, variables of type Foo<Rectangle> must be a Foo<Rectangle> and not anything anything else
Wait, hold on. That's not quite right
Gah
Interfaces can be covariant and contravariant
 
@Pavel exactly
 
4:23 AM
Anyone here good with objective c
trying to hack together VSL with objective c
 
@Downgoat :| objective c
 
iOS code sign is weird though
the only problem with swift if that it has nothing like VSL's @foreign
I can't control a function's symbol name
 
@Pavel That's not true of List<>, but you can assign a Rectangle[] to a Quadrilateral[] variable.
The rules for arrays are different than generics.
 
@recursive And what happens if you try to stick a new Trapezoid() in there?
 
An exception is thrown.
And yes, that means that array assignment has to do a run-time type check.
at least for arrays of reference types.
 
4:30 AM
Huh
 
there's an exception in the standard library just for that case
 
0
Q: This code errors on *this* and *that*, is it really written in them?

BubblerInspired by I'm not the language you're looking for! Challenge Choose two different programming languages, and write a program that prints the following line to stdout (or equivalent): This program errors out in <the current language> :P and then generates different kind of error in each of ...

 
Random idea: Add an error to a polyglot (answer-chaining)
 
@Bubbler ...
@Bubbler the first entry would already be >100 languages
 
Of course the errors should be distinct, and no syntax error allowed
 
4:38 AM
define syntax error objectively
 
Hmm
"Error thrown by the compiler/interpreter before the program is run", maybe?
I allowed invalid instruction at runtime in the above challenge, as one type of error
 
@Bubbler JS: eval("asldfkn*@#%")
is that allowed?
 
I would presume that's not a syntax error because a preceding statement would run.
 
according to JS, it's a syntax error, but according to his rules isn't a syntax rule
 
plus type errors are compile-time too
 
4:45 AM
"according to JS"? where?
 
"VM91:1 Uncaught SyntaxError: Invalid or unexpected token
at <anonymous>:1:1"
literally in the error message
 
@cairdcoinheringaahing Hey I was trying to run add++ and I was getting an error asserting that "code" was not defined. How am I supposed to run the language?
 
@ASCII-only btw you have any ideas on how exception system should work
 
@Bubbler define "program running" when does parsing become running?
 
@Downgoat like normal exception system?
 
4:46 AM
for VSL
internally and externally
 
@Downgoat what are you not sure about
@user56656 link pls
 
who are you trying to target? Modern functional programming developers? Corporate environments?
because everybody has an opinion on exceptions :P
 
@NathanMerrill That behavior can be triggered from any string, even one that didn't come from source code. I wouldn't consider that a syntax error in the program's source.
 
@DestructibleLemon Let me elaborate on that
Compiled language: an executable is generated, then it is run, so it's clear enough
 
4:49 AM
@user56656 try this? (i.e. look at the wrapper :P)
@Bubbler what if you use eval in a compiled language
 
Oh nice
I didn't know I could access the wrappers
 
Interpreted language: for Python and JS at least, the code is analyzed before running the code's first statement
but really not sure for others
 
This will save me hours of time
 
Is there a compiled language that supports eval?
 
@Downgoat do you have a design document?
not syntax design, but the goals of the language
 
4:51 AM
although I guess that has a parser so it can't actually throw syntax error
 
@NathanMerrill i had one written somewhere not sure if I can find it. We have some guiding principles written in GH: github.com/vsl-lang/VSL
 
how are you solving memory?
 
so far VSL is pretty fast, still working on optimizing the memory manager through lifetime checking
 
For any kind of eval, I believe it implies some sort of "runtime execution engine"
so I think I can allow "syntax error on eval" as one kind of error at runtime
 
4:54 AM
@NathanMerrill In some simple cases we can identify the lifetime of a variable at compile-time. Otherwise we use ref counting. The simple cases do account for a vast majority of variables though so it's relatively minor overhead due to memory imo
 
have you gotten your GC to work with LLVM?
 
@ASCII-only oh wow this is old
@NathanMerrill We're not using a GC we're inserting free/malloc into IR
 
how do you do ref-counting without GC?
like, I get the simple case stuff
that's awesome
but if you are inserting "ref-count here" blocks in the IR, how do you decide where they go?
 
oh i see what you mean
right now those go wherever we take a reference of something e.g. let a = x that would add a reference count
I'm not actually incrementing/decrement pointers in compiled code yet though
 
so memory leaks are still a thing (so far) :P
 
5:00 AM
yeah :P we've decided to get most other basic things (interfaces, subclassing, dynamic dispatch) done before we finalize RCing
 
well, exceptions make memory management harder. And every bit of memory management you add to VSL means that the programmer has less power over the speed of the program.
 
I'm thinking of doing things like forcing the user to address errors. e.g. if function f throws an error, you must do something like try? f(args) to call a function that errors.
 
that's the power that Rust and C give you: It's not about code execution speed, but predictability about how long things take
 
not sure what effect this will have but hopefully VSL will be be able to see where things will be caught
@NathanMerrill rust is cool but borrowing semantics scare me :P
 
@Downgoat so, Java checked exceptions?
and if you are going to force that, why not just return an Result<> variable?
 
5:06 AM
kind of, not too sure on how Java does exceptions
 
Java checked exceptions force you to declare that you throw them
and if you call the function, you either have to make the same declaration or try/catch them
 
@NathanMerrill If I'm going to force errors to be addressed I don't want to increase the overhead that they have in terms of both generated code, and VSL syntax
I'll have to think about this a little more and analyze a couple of cases.
 
fair enough: That kind of stuff can be compiled away, but that also comes with other disadvantages
you need to consider how easy it is to propagate errors
also, if you want the ability to distinguish different types of errors
if you want error messages
all of those decisions have other sub decisions I can talk about if you want as well :P
I've spent a lot of time discussing language desing
if you haven't, I recommend checking out /r/programminglanguages
 
@NathanMerrill I think itanium specifies some giant tables but I was wondering if I could just return some garbage value and check if some global error pointer specific to the current thread is set (or rather not set so branch prediction is on our side :P)
 
I'm talking about the programmer side:
what's the syntax of propagating errors?
are errors declared in the function definition? Does that mean that interfaces have to declare errors?
 
5:13 AM
@NathanMerrill oh I see what you mean, I might have a generic throws in the function header but it probably wouldn't be hard to detect the try! calls which would propogate errors
 
right, but you need to make it as painless as possible to say "Don't handle the error here"
think about parsing JSON, for example
you're going to have 20 functions that call each other, one for parsing an integer, one for parsing a string, etc
any of them can throw a "InvalidJSON" error
and you want to propagate any of those errors as painlessly as possible
so, if I call a function that throws InvalidJSON, and I've also declared I throw an InvalidJSON, do I no longer need the try? syntax?
 
@NathanMerrill not decided
 
I personally think that Java checked exceptions are a good idea, but they had two primary downfalls:

1. try/catches are verbose and annoying to deal with due to scoping
2. The easy route of dealing with the exceptions was often the wrong route (wrapping them in an unchecked exception, or doing nothing). Programmers got in the habit of simply wrapping everything in try/catches
as far as #2, you can blame the programmers, but when a large portion of programmers do something, it's the language I blame
 
@NathanMerrill yeah this definetly makes sense, ideally I was planning on something like this:
    func erroringFunc() -> Int throws {
        // ... some condition
        if something {
            throw some error
        } else {
            return 4
        }
    }

    // for propogating error
    func anotherFunc() -> Int throws {
        return try erroringFunc()
    }

    // Now to handle
    guard let value = try? anotherFunc() else {
         // handle error once at the top
    }

    // use variable safely here.
 
can you tell what the failure was?
 
5:25 AM
ok, so no distinguishing of errors, and no error messages
 
so i.e. you don't really need try catch until the very top where you can either unwrap it, or something
 
that's fine, but it's important to ensure that that is what you want
 
@recursive Sure, if you use plain ol' try expr() but for that you'd have to either use try statement that I haven't designed yet
I was thinking something along the lines of:
try JSONError.parseError(let errorMessage) = JSON(string: myJson) {
     print("oh no! could not parse your json: #{errorMessage}")
}
where JSONError is an associated enum
 
     func erroringFunc() -> Int? {
            // ... some condition
            if something {
                return null
            } else {
                return 4
            }
        }

        // for propogating error
        func anotherFunc() -> Int? {
            return erroringFunc()
        }

        // Now to handle
        let value = anotherFunc()?: 4


        // use variable safely here.
you aren't gaining much functionality over an optional type
 
with optional types you dont get any info on the error itself though
also they are a little more difficult to propogate
 
5:31 AM
True. But that error message is costing you all of that syntax above
 
I mean the syntax is an extra try or try? prefix
 
plus all of the stuff in let value =
 
and you could still do try? anotherFunc() ?? 3
but then again you loose the ability to only be optional in a specific case and propogate in others
not sure what syntax would be for that though
 
wait, you are going to do different types of errors?
 
https://tio.run/##hVTBcts2EL3jK7aIY0mOBIpS3SZ2yXFm3NbqdOqM4/FMJ3VTSARNWCDAgqAkus1MTpl8Qi79iNx7qo/9i/wIC5KyRclqq8MSwFsudt971JimUVFMqAEfEq2uNI2JWRiE2CRS0JOAd1wMFqRBkCQVtEIGFWI0p/IqE1Rzk29kDKuMaybEJvJ5haSGTqYs2MD2KyzJTaTkkCR5A/riHtp458sKmEc8TZhON8CnFXi2cfqsOtXMcEk3oN/c/htc9qfimD3A3Aq7pjOaTjRPzIOEQZUwq5lczgGOSoxT0VjGJ0/sYNDrZSa0MeSCrSi2NY4wfAWEyySz1bnaqLJGuXO@JoCt@kCRbQWrQpUydYQwWwm15YVyvqUt8MtaNggUS2XLwFzpKeTMYPQI2CJR2sAPp8dfv37x/PzEw06WakfwsSNVwF7HKsgES8vUcl8PtPTB3ZNcp01rbGu/tOxqD7/f2aVpm3XSyk0VSoruHPRfLN@Z6X5Rvth02L/Sqp0xl85Z7Y7ad9tyazLPKgNu4zJWUtWt1CZ16lTCFqxh222VdTbOl8yWDq4j0eOVof9H4e/uzb3
 
5:33 AM
what do you mean by different types?
 
@0' There you go
 
0																												'
thanks
 
Planning on not going the way of JS and having throw new Error() rather having an error enum which you can (and should) pass associated data with
 
aka, you can catch a "FileOpenError" but not a "InvalidJSONError"
 
yeah
I don't see much use in a plain new Error() other than propogating a message
 
5:35 AM
do error types get declared in the function?
lets say I see an interface {someFunc() throws}
how do I know which errors it can throw?
 
@NathanMerrill I dunno yet if that's necessarily to declare what types of functions get thrown. I can see the use in terms of virtual functions but specifying the type of all possible errors is cumbersome
 
ok, so lets say I have a function that catches a FileOpenError
that function still has to declare that it throws an error
because even if the function you're calling only throws a FileOpenError, the compiler doesn't know that
it has to assume it can throw anything
so you must either catch everything, or declare throws yourself
someFunc() //Does a throws go here? {
    try? throwsOnlyFileOpenError() catch FileOpenError
}
 
5:57 AM
https://tio.run/##hVXNbhs3ED6bTzFlHEuyLa5WivNjddcJkLZxUdSFYxgtHNeltFxr7f0LyZUl1wF6KvIIufQheu@pOfYt8iLbIVeypLXTagH@zDcczgy/GQ24GpXlkGvwIZfZueQJ0xNNiBiOMminQNddCgjyIMhzCy2QrkW0jHh6XsRcRnpa0@hZjQsRx3XkkUWU5sNLEdSwHYvlUz3K0h7Lp0vQ41uoduaJBa5GkcqFVDXwqQUPa9JnViqFjlJeg351O@@o8S9LEnEHcy12wcdcDWWU6zsKXaswviPvWTk6GO@sYlGSZ1KDmqp@6KHizrt@LqNUN8MmypjSQZQyKXjQbLVadJGc7p0rHtsr3hZcasyD5mF4R@WJVcFUaaFyPqziIzOL4GS5duxrm3FrC/MP7XahQxzDKBYLJsCXwKI0LzD@KKsZWCGFc7RCETR4hzM1W9aGpU01QlgsWLSqayKb0ZW@rugEQSZU2tBwlclLmApNyQMQE5vi7w9efnX2w4ujVx51CiWdOBo4aRaIsyQLilgoo2r2VRgzfs5ndqGWKVtz2lTRYg8380daZvJqlszGDiYnc1L/V1r
@0' new version
 
0																												'
thanks
 
6:34 AM
@user56656 Yeah, it needs either the --file or --cmd flags, although I'm not sure why it didn't exit with the normal argparse error without either
 
6:51 AM
0
Q: The next colour

loladChallenge Be able to cycle through the colours of the rainbow Input A string containing a colour of the rainbow. Ignore any errors if this is not a colour. Output The next colour of the rainbow. Example Input and Output Provide at least one example input and output. Make sure they match yo...

 
 
2 hours later…
8:56 AM
CMC: title a tittle. Example: s/([ij])/\n#\1\n/g
 
9:09 AM
@NathanMerrill no? sane compilers just assume the function throws anything called functions can throw
@betseg :| that would look completely terrible
 
0
A: Sandbox for Proposed Challenges

SouthpawThe Challenge The goal is to write a complete program that prints out every possible tetris block made up of #. The blocks must print out in a random order and must appear exactly once each. The blocks may have any rotation, rotation may be consistent between executions. No two blocks can be to...

 
So I wanted to use C Macros in Lua. So I just threw my lua scripts through CPP and turns out that works fine.
 
9:35 AM
@Pavel ooh, interfaces have static methods now? (well, technically, the compiler would create one to perform static initialisation, you just couldn't explicitly write one before.)
 
@Neil No (read the next message(s)) (also, do you mean Java)
 
@betseg What?
 
O_o C# has static constructors
 
@ASCII-only yes I mean Java
 
@Adám a "tittle" is the dot above lowercase I and J
 
9:40 AM
@Neil also wait static methods in interfaces are a new thing?
 
apparently
 
@EriktheOutgolfer Sure, but what exactly is the quest? Generate markdown? I.e. enclose "i"s and "j"s with \n# and \n?
 
@Adám I guess so, CMCs needn't be that clear :P
 
@betseg QuadR, 10 bytes: i j \n#&\n
 
10:27 AM
Huh... TIL that the "possible duplicate" note is a part of the question edited by Community.
 
it used to be
 
It isn't now?
 
@Adám yes
 
Anyone know how to get user data folder in .NET Core?
 
Anybody hear knows French, Italian, Finnish, or German and would be willing to help me translate a few words?
 
10:38 AM
@ASCII-only Do you mean the profile dir or ... ?
@Adám Sure
 
@mınxomaτ AppData/Local, and its equivalent in Linux
 
@ASCII-only Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
 
@mınxomaτ Thanks. How would you translate "Array Editor" and "Edit current object with Array Editor"?
 
You need to impersonate the user if your want to get the path for a different one.
@Adám "Array Editor" and "Aktuelles Objekt mit Array Editor bearbeiten"
 
@mınxomaτ Thanks.
 
10:41 AM
@mınxomaτ :/ appears not to work for Linux
 
Of course not.
There is no AppData direcory on linux.
You need to if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) and then resolve what you actually want on each OS.
 
The directories that the environment variables $XDG_CACHE_HOME, $XDG_CONFIG_HOME and $XDG_DATA_HOME have?
 
I recommend $HOME/.appnamehere in general
 
@mınxomaτ :| why that over ~/.local/share
 
^ is $XDG_DATA_HOME 99% of the time
 
10:55 AM
Has SO just offline? (like a minute ago or something)
 
11:07 AM
@betseg [ij] => i|j since you're already using -r
 
@betseg TIO doesn't have that right
@betseg would manually joining the path with $HOME work
 
11:32 AM
Can I toggle favorite from SE keyboard shortcut? No?
 
@orlp From what I see from previous messages in TNB you have/had an Ergodox keyboard?
 
@Fatalize yes
couldn't get used to the ortholinear layout
 
SO you don't use it?
I already have an orthogonal keyboard (Typematrix), but I'm considering getting an ergodox for those extra thumb keys
(and the programmability)
 
11:50 AM
@Adám In French: "éditeur de tableau" et "éditer l'objet courant avec l'éditeur de tableau".
 
@Arnauld Cool. Thanks.
 
@Fatalize I don't
@Fatalize if you can handle the ortholinear keys, go for it
I didn't realize it'd be such a big problem for me
 
It's expensive though :p
 

« first day (2608 days earlier)      last day (2235 days later) »