#⌨coders-cave

1 messages · Page 27 of 1

wet girder
#

I coded almost exclusively in python for 5-6 years

#

or more

#

lol

prisma grail
#

Dear god, that'd feel like torture if I were to do that with my current knowledge. xD

#

In some cases, you're by some miracle also just a natural at it.

wet girder
#

Never seen anyone be naturally good at something. Some people just have easier time at learning some things

prisma grail
#

When I first started learning Java, I never really had any issues understanding anything, I was immediately able to apply anything the teacher explained in exercises without much thinking about it.

#

The only time I needed to "study" for a programming test was the first ever test, when I was frantically trying to memorize "public class FileName { public static void main(String[] args) {" for the test, since we were forced to use Notepad++ back then.

wet girder
#

It took me an incredible amount of effort to get out of the tutorial hell and be able to apply what I knew of coding. I partially blame school for that, school was stupidly easy for me always and nothing before learning coding had challenged my brain before coding. Nowadays I've joined Mensa which is mostly just a circle jerk club so I am not that active in it but I found good material there that helped me realize that school was absolutely awful for me. God knows how succesfull I could be if I could've progressed in school in my own pace and not in my classmates pace

prisma grail
wet girder
#

The time I did in vocational school classes was mostly wasted lmao. They were very beginner classes and my teacher noticed I mostly played video games in the class and still completed everything in 10th of the time others did so he sent me to work and I've worked since

prisma grail
wet girder
#

Is there really no way to fast track it? In Finland you can always do your studies faster (expect primary education for some fucking reason)

prisma grail
prisma grail
wet girder
wet girder
prisma grail
wet girder
#

I only used it during vocational school

#

Never since

#

Mostly because of the amount of artifacting

prisma grail
#

I'm talking 2k/month I stead of 3k/month on an entry level.

#

Companies would probably love the value proposition in that, but I sure don't.

wet girder
#

I have the lowest level degree possible and get paid as much as people with bachelor degrees. If a company requires an education from me over knowledge and experience I wouldn't want to work there anyway

#

And if I don't get paid fairly I'll just jump ship

#

Companies in Finland have started learning that it ain't wise to look at degrees

#

atleast in IT that is

prisma grail
#

Yeah, I think that a most Austrian companies aren't at that point yet.

#

So I'd rather just go the 2.5 more years of school while working part time.

#

So that I can then easily get a good job.

wet girder
# wet girder And if I don't get paid fairly I'll just jump ship

Plus if I don't find a new job I am just gonna go study something. I'd go to fire academy but because I had asthma as kid I can't because too big risk for the work to cause the asthma to return so I've been thinking of possibly studying to be a police, would be cool

wet girder
prisma grail
prisma grail
# wet girder That's fair but sounds like a pain

I've pretty strongly thought before of getting straight to full time work instead of school, I think that the two main things holding be back from doing it are the fact that my current work place is probably (I have no proof, but would be surprised if not) transphobic, when I'd need to stay with them for a while to get full time work experience to "substitute" for the education, and the fact that the average older person in my country would effectively consider me a school dropout that got lucky.

distant wraith
#

Not trying to be rude, but who are you? 🧐

jolly field
barren shale
mortal nest
#

Hello

#

😋

jolly field
next shell
barren shale
#

its a joke smh xzibit

jolly field
mortal nest
barren shale
prisma grail
main stag
jolly field
jaunty latch
#

Leave this place at once

feral bramble
distant wraith
#

Right

quartz pumice
flat valley
lapis flint
prisma grail
#

I just realised that a very useful Reflection feature in Java for working with generic types doesn't exist in C#, and me having assumed that the feature must exist wasted a whole lot of my time. My hopes and dreams have now forever been shattered by the fact that there's Reflection related tasks that Java can do infinitely better than C#. TwT

#

(I'm talking about Javas wildcard operator for generic type specification and the lack of it in C# btw.)

flat valley
#

This is why Java is goated

prisma grail
#

Like, for the love of god, Java literally makes me code out private fields with getter and setter methods.

#

Instead of having some proper property syntax like C#.

lapis flint
#

I think it is in c#, mb i am wrong and misunderstood

prisma grail
#

I'd be very glad if I'm wrong though.

lapis flint
#

And how it should works?

barren shale
#

yeah

#

just do Foo x;

prisma grail
lapis flint
#

So use object

prisma grail
barren shale
#

oh

#

but what would be the return datatype

#

how would the function work

lapis flint
#

Lets google java explanation

barren shale
#

it seems like this way of doing things is full of problems

prisma grail
barren shale
#

the point of having a generic is to use the generic functions

prisma grail
#

When you use a method that returns the generic type, you get a ?.

barren shale
#

but how would you use the generic functions if you dont know what the generic type is

barren shale
prisma grail
#

But can be needed when doing Reflection.

barren shale
#

what are you trying to do

#

there's probably a way to do it without this

lapis flint
#

I even don't know what to google, googling anonymous generics in java does nothing

barren shale
#

because i never had to think about using this

prisma grail
# barren shale what are you trying to do

(Btw, I already resolved this by creating a non generic version of the class that the generic version inherits from, so I don't really need actual help with this, I can happily discuss it anyways though.)

lapis flint
#

What ? does in java?

barren shale
#

i mean you can do something like this

#
class A {

}

class A<T> : A {

}
prisma grail
barren shale
#

and then you can

A a = new A<T>();
prisma grail
barren shale
#

the non generic functions go to A and the generic functions go to A<T>

#

but at least here its not amigious as it is with the <?>

prisma grail
# barren shale because i never had to think about using this

I'm using Reflection to iterate through every Type of an Assembly, grab ones that inherit from my generic base class, then grab their static properties, then filter out the properties that don't return some implementation of the generic type, and with the other ones, I need to access a field of them that has the generic type as its type and pass that to some other method as an object.

lapis flint
#

Oh, i understood wildcards, its generisation for generics, true, sometimes in c# i need it

barren shale
#

well

lapis flint
#

Let me show example

prisma grail
#

In Java, I can easily use ? for making the steps past grabbing the properties easy.

barren shale
prisma grail
#

In C#, I needed to go out of my way to implement a version of the class that doesn't use generics.

lapis flint
#

It doesnt solves

barren shale
#

it does

lapis flint
#

For example for generic methods

barren shale
#

yeah i dont think in java you get generic methods when you use<?>

#

because you cant know the type

prisma grail
prisma grail
lapis flint
#

But in c# it doesn't

barren shale
barren shale
lapis flint
barren shale
#

if a function returns T

#

and I do Foo<?> foo = get it somehow();

lapis flint
#

It is extends something specific

barren shale
#

and then foo.function();

#

oh

lapis flint
#

So, anything inherited from animals can be casted like whole collection

barren shale
#

isnt that void iterateAnimals (Collection<T> animals) where T : Animal in C#

prisma grail
# barren shale that boxes the default value

I literally needed to make this stupid non generic base class, just so that I can use Reflection to do some stuff with it. In Java, I could do the same thing while having only the generic class.

lapis flint
#

Imagine casting List<string> to List<object> and back just as usual cast

barren shale
#

too much boxing xzibit

barren shale
lapis flint
prisma grail
#

It's literally the only reason why the non generic class has to exist.

barren shale
#

idk through all my 7 years of using C# i never ran to this problem

prisma grail
barren shale
#

a lot

#

sb 2 is full of reflection

#

i use it for spells

#

and of course other stuff like this

prisma grail
# barren shale

Ok, fair, but how about Reflection code that interacts with generic classes?

lapis flint
#

I used it for my bot only for commands initialization

#

So you have different class for every spell?

barren shale
#

maybe dont use generics for this

#

why do you need your configoption to be generic

lapis flint
prisma grail
# barren shale never

I mean, that's exactly the feature combination in which I'm running into this problem.

prisma grail
#

If I want to access a config option value.

#

I just want to get its type right away.

barren shale
#

why cant you just add it directly to the config

prisma grail
#

Instead of needing to do weird casting.

lapis flint
barren shale
#
class Config {
public A ConfigOptionA { get; set;}
public B ConfigOptionB { get; set;}
}
#

like this

#

or if you wanna do sections

prisma grail
barren shale
#

hmmm

prisma grail
#

With its Config system, you get your values as an object, and need to cast everything.

barren shale
#

i guess that's the only way

prisma grail
#

And I'm working on a system that takes care of those aspects for me.

barren shale
#

that's why i never build on top of stuff xzibit

prisma grail
barren shale
#

can you show me your code for the assembly thing

#

reflection thing*

prisma grail
#

You want to see anyways?

barren shale
#

ive looked at worse

#

i have a C# repo from 2015

prisma grail
# barren shale ive looked at worse
      IEnumerable<ConfigOption> configOptions = typeof(ConfigOption<>).Assembly.GetTypes().Where(t => t.BaseType == typeof(ConfigOption<>)).SelectMany(t => t.GetProperties()).Select(p => p.GetMethod).Where(m => m.ReturnType == typeof(ConfigOption<>)).ToList().Select(m => m.Invoke(null, null)).Where(o => o.GetType().IsAssignableFrom(typeof(ConfigOption<>))).Cast<ConfigOption>();
      // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
      configOptions.Where(configOption => _configFile[configOption.Section, configOption.Field] == null).Select(configOption => _configFile.Bind(configOption.Section, configOption.Field, configOption.DefaultValue, configOption.Description));
barren shale
#

the code there is very cool

#

this _configFile is the class you are wrapping?

prisma grail
#

Takes two strings to specific Section/Field.

#

And an object that's the default value.

#

Well, and also a description string, but that's kinda besides the point rn. :P

#
    internal static T Get<T>(string section, string field) {
      if (typeof(T) == typeof(string)) return (T) Convert.ChangeType(_configFile[section, field].GetSerializedValue(), typeof(T));
      return JsonConvert.DeserializeObject<T>(_configFile[section, field].GetSerializedValue().Replace("\\", ""));
    }
    
    internal static void Set(string section, string field, object value) {
      _configFile[section, field].SetSerializedValue(JsonConvert.SerializeObject(value));
      _configFile.Save();
    }

    internal static T Get<T>(ConfigOption<T> configOption) {
      return Get<T>(configOption.Section, configOption.Field);
    }
    
    internal static void Set<T>(ConfigOption<T> configOption, T value) {
      Set(configOption.Section, configOption.Field, value);
    }
#

I can then conveniently interact with the config like this.

#

Without needing to worry about any sort of type casting or anything like that.

barren shale
#

send me the code for the config option classes

#

gotta write this shit on my pc

prisma grail
# barren shale send me the code for the config option classes
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public abstract class ConfigOption<T> : ConfigOption {
    public new T DefaultValue => (T)base.DefaultValue;
    internal ConfigOption(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
  }

  public abstract class ConfigOption {
    public string Section { get; }
    public string Field { get; }
    public object DefaultValue { get; }
    public string Description { get; }
    
    protected ConfigOption(string field, object defaultValue, string description) {
      Section = GetType().Name;
      Field = field;
      DefaultValue = defaultValue;
      Description = description;
    }
  }
}

These are the base classes.

#
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class General<T> : ConfigOption<T> {
    public General(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public ConfigOption<bool> IgnoreCriticalMods => new General<bool>("IgnoreCriticalMods", false, "If true, KeyGUI won't do anything about mods that the server flags as critical.");
    public ConfigOption<bool> OnlyAllowOneOpenSubmenu => new General<bool>("OnlyAllowOneOpenSubmenu", false, "If true, KeyGUI will only allow one submenu to be open at a time.");
    public ConfigOption<bool> ForceOpenAllMenus => new General<bool>("ForceOpenAllMenus", false, "If true, KeyGUI will force all menus to be open.");
    public ConfigOption<bool> InitializeAssetFoldersEveryStartup => new General<bool>("InitializeAssetFoldersEveryStartup", true, "If true, KeyGUI will create the most recent needed asset storage structure every startup. This is useful if you want to make sure that mod updates keep the folder up to date.");
  }
}

And from there, I ext4end them like this to create specific sections and their fields.

#
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class Traits<T> : ConfigOption<T> {
    public Traits(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public ConfigOption<bool> ShowTraitsTutorial => new Traits<bool>("ShowTraitsTutorial", true, "If true, KeyGUI will show basic instructions on how to use the custom trait maker.");
    public ConfigOption<bool> AutoloadTraits => new Traits<bool>("AutoloadTraits", true, "If true, KeyGUI will automatically load custom traits stored in worldbox_Data/KeyLibraryModsData/KeyGUI/Traits.");
  }
}
#
using System;
using Newtonsoft.Json;

namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class Internal<T> : ConfigOption<T> {
    public Internal(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public ConfigOption<string> Id => new Internal<string>("Id", "UNABLE_TO_DETERMINE", "A made up ID for some simple data collection during server communication. Change this value to -1 to prevent any data collection from happening, refrain from touching it otherwise. To get data deleted that has already been stored of you, contact keygui-data-management@keymasterer.uk with your ID.");
    public ConfigOption<string> WhitelistedMods => new Internal<string>("WhitelistedMods", JsonConvert.SerializeObject(Array.Empty<string>()), "Mods that are whitelisted by the user and won't be flagged as problematic.");
  }
}
#
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class Items<T> : ConfigOption<T> {
    public Items(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public ConfigOption<bool> AutoloadItems => new Items<bool>("AutoloadItems", true, "If true, KeyGUI will automatically load custom items stored in worldbox_Data/KeyLibraryModsData/KeyGUI/Items.");
  }
}
#
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class GameSettings<T> : ConfigOption<T> {
    public GameSettings(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public ConfigOption<bool> DisableAutosaves => new GameSettings<bool>("DisableAutosaves", false, "If true, KeyGUI will disable the games autosave system.");
    public ConfigOption<bool> DisableBoatsBreakingIce => new GameSettings<bool>("DisableBoatsBreakingIce", false, "If true, KeyGUI will disable the ability of boats to break ice.");
  }
}
#

With the system as it currently is, I only need to create a new property in one of these sections, or a new section, and I can just use them with the wrapper, without needing to write any extra code for stuff like binding them to the underlying config.

lapis flint
#

I thought my generics are weird

prisma grail
#

I just declare the property; pass it to the Get/Set methods.

#

And all of the initial config file binding is handled by Reflection.

prisma grail
lapis flint
#

Just for one method

#

And thats all

#

To avoid repeats

barren shale
#

@prisma grail ditch the non generic

#

and use more reflection

#

its gonna be the same performance as you are still boxing

#

but it looks nicer

#
var defaultValues = typeof(ConfigOption<>).Assembly.GetTypes()
    .Where(t => t.BaseType == typeof(ConfigOption<>)).SelectMany(t => t.GetProperties()).Select(p => p.GetMethod)
    .Where(m => m.ReturnType == typeof(ConfigOption<>)).ToList().Select(m => m.Invoke(null, null))
    .Where(o => o.GetType().IsAssignableFrom(typeof(ConfigOption<>))).Select(x => x.GetType().GetProperty("DefaultValue").GetValue(x));
#

defaultValues is an IEnumerable<object?>

#

you might need to remove the nulls if you dont want them with another Where

prisma grail
barren shale
#

oh you need them all

prisma grail
#

Major pain right there. wbtroll

barren shale
#

yeah i guess the way youre doing it is the only waay

#

this is the pain of building on top of things

#

a lot of reflection

#

a lot of object

#

doesnt look as clean as normal code

prisma grail
barren shale
#

JSON it?

#

File.WriteAllLines(); and File.ReadAllLines();

#

oh i guess you dont need File.ReadAllLines();

prisma grail
barren shale
#

or write all lines

prisma grail
#

Oh, wait.

barren shale
#

literally just File.WriteAllText();

#

and give it a path

#

use / at the start to make it local

prisma grail
#

Well, I already have this logic now, and this rewrite would also mean that I'd need to write code for migrating already stored data from the old system to the new one.

barren shale
#
var json = "AAA";
File.WriteAllText("/config.cfg", json);


var readJson = File.ReadAllText("/config.cfg");
var results = JsonSerializer.Deserialize<object>(readJson);
#

make sure you wrap it all in a try catch and display an error if it throws

#

file read/write throws a lot

#

especially on windows

#

at least a lot more than expected

prisma grail
barren shale
#

also wrap the json serialize and deserialize

#

i dont like C# cuz it doesnt tell you all of this can through

#

there should be a strict option where it doesnt allow you to code like this

north dune
barren shale
#

i wanna enable that on sb 2 and watch it get destroyed

barren shale
#

C# stands for Cody Sharp after all

north dune
#

tacode time

prisma grail
barren shale
#

doesnt do anything

#

unless you are using unsafe code

prisma grail
#

And then write unsafe code too.

barren shale
#

which even the Unsafe class doesnt have

prisma grail
barren shale
#

i like how the Unsafe class is full of memory safe methods xzibit

prisma grail
barren shale
#

its just unsafe because the result you get might not be what you expect

prisma grail
#

Ah, fair.

barren shale
#

Marshal and Unsafe are the classes of the C# gods

#

i dont dare touch them

#

also Span

#

requires too much brain

#

can give you extra fast for loops though

#

I've had to touch Memory for sb 2 though

#

and ever since i feel like ive added a memory leak somewhere

#

these classes are too dangerous xzibit

prisma grail
prisma grail
prisma grail
barren shale
#

i mean these kind of optimizations are not really necessary

barren shale
#

i bet it has a good answer too xzibit

prisma grail
barren shale
#

sounds like Marshal to me

prisma grail
#

Reading that, I'd say that not touching it is quite the good idea.

#

@barren shale C# is making my life with this more and more painful by the second.

#

Rn, I'm getting exceptions thrown at me by Reflection because I'm trying to invoke a getter where the return value has a generic type.

#

Like, whoever made Reflection in C# seems to have a hatred towards generics.

barren shale
#

are you not giving it the object xzibit

#

show me the code

prisma grail
barren shale
#

and what exception are you getting

prisma grail
#

Well, it's not in the code I sent above.

barren shale
prisma grail
#

On accident.

barren shale
#

you mean field

prisma grail
# barren shale wtf is a static property
    public static ConfigOption<bool> IgnoreCriticalMods => new General<bool>("IgnoreCriticalMods", false, "If true, KeyGUI won't do anything about mods that the server flags as critical.");

I meant that it's got a static modifier?

#

Something like this.

barren shale
#

what is the reflection code

prisma grail
prisma grail
# barren shale what is the reflection code
      IEnumerable<ConfigOption> configOptions = typeof(ConfigOption<>).Assembly.GetTypes().Where(t => typeof(ConfigOption).IsAssignableFrom(t)).SelectMany(t => t.GetProperties()).Select(p => p.GetMethod).Where(m => typeof(ConfigOption).IsAssignableFrom(m.ReturnType)).Select(m => m.Invoke(null, null)).Where(o => o is ConfigOption).Cast<ConfigOption>();

The Select() with the m.Invoke() is where the exception is thrown.

#

Just tried changing it from a property to a field.

#

C# literally gave me a warning for that right away.

barren shale
#

nah this is a property

prisma grail
#

I also called it that.

prisma grail
barren shale
#

ye i thought you were using static auto properties

prisma grail
#

No. xD

barren shale
#

so what is the m.Invoke invoking

prisma grail
prisma grail
#

That's safe to assume; I already debugged through the code to assure that it's grabbing the correct properties.

barren shale
#

but it doesnt make sense

#

properties of ConfigOptions are other ConfigOptions?

prisma grail
#

And trying to use a field instead of a property gets me a System.InvalidOperationException: Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true..

prisma grail
barren shale
#

hmmm

#

still dont get it

prisma grail
#

That's basically what I'm doing.

barren shale
#

like whole file

#

or a bigger part of the file

prisma grail
# barren shale can you show me the whole code for this
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public abstract class ConfigOption<T> : ConfigOption {
    public new T DefaultValue => (T)base.DefaultValue;
    internal ConfigOption(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
  }

  public abstract class ConfigOption {
    public string Section { get; }
    public string Field { get; }
    public object DefaultValue { get; }
    public string Description { get; }
    
    protected ConfigOption(string field, object defaultValue, string description) {
      Section = GetType().Name;
      Field = field;
      DefaultValue = defaultValue;
      Description = description;
    }
  }
}
namespace KeyGUI.Menus.ModConfig.ConfigOptions {
  public class General<T> : ConfigOption<T> {
    public General(string field, T defaultValue, string description) : base(field, defaultValue, description) { }
    public static readonly ConfigOption<bool> IgnoreCriticalMods = new General<bool>("IgnoreCriticalMods", false, "If true, KeyGUI won't do anything about mods that the server flags as critical.");
    public static ConfigOption<bool> OnlyAllowOneOpenSubmenu => new General<bool>("OnlyAllowOneOpenSubmenu", false, "If true, KeyGUI will only allow one submenu to be open at a time.");
    public static ConfigOption<bool> ForceOpenAllMenus => new General<bool>("ForceOpenAllMenus", false, "If true, KeyGUI will force all menus to be open.");
    public static ConfigOption<bool> InitializeAssetFoldersEveryStartup => new General<bool>("InitializeAssetFoldersEveryStartup", true, "If true, KeyGUI will create the most recent needed asset storage structure every startup. This is useful if you want to make sure that mod updates keep the folder up to date.");
  }
}
    public static void SetUpConfig() {
      IEnumerable<ConfigOption> configOptionsTest = typeof(ConfigOption<>).Assembly.GetTypes().Where(t => typeof(ConfigOption).IsAssignableFrom(t)).SelectMany(t => t.GetFields()).Where(f => typeof(ConfigOption).IsAssignableFrom(f.FieldType)).Select(f => f.GetValue(null)).Where(o => o is ConfigOption).Cast<ConfigOption>();
      IEnumerable<ConfigOption> configOptions = typeof(ConfigOption<>).Assembly.GetTypes().Where(t => typeof(ConfigOption).IsAssignableFrom(t)).SelectMany(t => t.GetProperties()).Select(p => p.GetMethod).Where(m => typeof(ConfigOption).IsAssignableFrom(m.ReturnType)).Select(m => m.Invoke(null, null)).Where(o => o is ConfigOption).Cast<ConfigOption>();
      // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
      configOptions.Where(configOption => _configFile[configOption.Section, configOption.Field] == null).Select(configOption => _configFile.Bind(configOption.Section, configOption.Field, configOption.DefaultValue, configOption.Description));
    }

Unless I'm forgetting something, these classes and this method are everything that's relevant to the error.

#

And that first line of the method is the eroneous one.

#

Oh, wait, there's two lines there.

#

The first one is the test I just did with using a field instead of property.

#

For which I also made one property in general a field isntead.

#

And the second line is the one for when the classes contain properties.

#

Both of these throw exceptions when trying to get their values, because said value has a generic type.

barren shale
#

first you might want to add && !t.IsAbstract to the first where

#

probably wont fix it

#

but this is a property so it might be causing a problem

barren shale
#

i think that fixes it

#

because the only property that has an unbound generic is the DefaultValue

prisma grail
#

System.InvalidOperationException: Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true.

barren shale
#

you sure its doing it on that exact field

#

maybe filter to static fields only

prisma grail
barren shale
#

can you show me the debugger

#

while hovering on it

prisma grail
#

Results of typeof(ConfigOption<>).Assembly.GetTypes().Where(t => typeof(ConfigOption).IsAssignableFrom(t)).Where(t => !t.IsAbstract).SelectMany(t => t.GetProperties()).Select(p => p.GetMethod).Where(m => typeof(ConfigOption).IsAssignableFrom(m.ReturnType)).

#

A.k.a. all of the LINQ from before the .Select() that invokes the methods.

barren shale
#

after the error happens

#

which one is causing it

#

hover on the m in m => m.Invoke

#

what is the Id property

#

well

#

i just ran the code

#

and it ran completely fine

#

your error is in these @prisma grail

prisma grail
barren shale
#

.net 8

prisma grail
#

I forgot to mention this, but I'm running .net framework 4.8.

barren shale
#

maybe that's the problem

#

another reason on why i dont build on top of stuff

prisma grail
barren shale
#

unity ☕

prisma grail
#

Totally forgot that I need to point that out, since this channel isn't WorldBox related. :P

barren shale
#

they are going to add .net core support this year apparently

#

but i dont think wb code base will update

#

might cause too many problems

#

but tbh .NET 8 is so much faster than .NET framework that an upgrade would be cool

barren shale
prisma grail
#

So I get to deal with mono instead.

barren shale
#

mono 🤮

prisma grail
#

And stuff is all weird.

barren shale
#

mono is so stupid

prisma grail
barren shale
#

first i would change .Select(m => m.Invoke(null, null) with .Select(m => { Console.WriteLine(m.name); return m.Invoke(null, null); })

#

unless you can tell exactly which property is causing the error

#

with your IDE

#

the last name written in the console should be the name of the erroneous method

prisma grail
barren shale
#

because it doesnt seem like these fields are late bound generics

#

you are specifiying that they are bool in this case

prisma grail
#

Ok, Mono just got onto drugs, I'm quite sure.

barren shale
#

hmm?

#

did you know which method is causing the problem?

prisma grail
#

The entire console output.

#

Random NRE.

#

No line counts.

#

And break points aren't working correctly.

barren shale
#

why is it giving a different error

#

did you change the code?

prisma grail
barren shale
#

so which method is causing the error

prisma grail
prisma grail
barren shale
#

what did it print?

prisma grail
barren shale
#

it cant throw the right one

#

without it giving you the name

prisma grail
# barren shale but this

Well, yeah, the output was weirdly bugged. I was just able to make it work properly by moving the code to somewhere else.

#

Problem seems to be OnlyAllowOneOpenSubmenu.

barren shale
#

which is the first property

#

so its most likely in all of them

prisma grail
barren shale
#

switch generics with classes

#

only way

#

i guess

#
public class BoolConfigOption : ConfigOption {
    public new bool DefaultValue => (bool)base.DefaultValue;

    internal ConfigOption(string field, bool defaultValue, string description) : base(field, defaultValue, description)
    {
    }
}

public abstract class ConfigOption
{
    public string Section { get; }
    public string Field { get; }
    public object DefaultValue { get; }
    public string Description { get; }

    protected ConfigOption(string field, object defaultValue, string description)
    {
        Section = GetType().Name;
        Field = field;
        DefaultValue = defaultValue;
        Description = description;
    }
}
#

something like that

#

not as clean as the generics though

#

or use

    public static ConfigOption OnlyAllowOneOpenSubmenu => new General<bool>("OnlyAllowOneOpenSubmenu", false,

might fix it

prisma grail
barren shale
#

but you dont get the type of the configoption

prisma grail
#

Should technically satisfy the weird requirement C# is imposing unless I'm being stupid rn.

barren shale
#

what do you mean back those with generics

#

oh i know what you mean

prisma grail
barren shale
#
public class BoolOption : ConfigOption<bool> {

}

public abstract class ConfigOption<T> : ConfigOption
{
    public new T DefaultValue => (T)base.DefaultValue;

    internal ConfigOption(string field, T defaultValue, string description) : base(field, defaultValue, description)
    {
    }
}

public abstract class ConfigOption
{
    public string Section { get; }
    public string Field { get; }
    public object DefaultValue { get; }
    public string Description { get; }

    protected ConfigOption(string field, object defaultValue, string description)
    {
        Section = GetType().Name;
        Field = field;
        DefaultValue = defaultValue;
        Description = description;
    }
}
#

doesnt look too bad

#

ofc you gotta add the consturctor

#

but yeah

prisma grail
static solar
#

Question: Why is ConfigOption abstract?

prisma grail
#

Section = GetType().Name;

#

Did that to save myself the writing effort of needing to specific a category via constructor arguments.

static solar
#

Makes sense

prisma grail
#

Since the Section is always the same per subclass.

#

Gotta say goodbye to that system now though, because of the stupid reflection limitations.

prisma grail
barren shale
#

noice

prisma grail
#

(Still kinda hurts though how horrible C# reflection is at dealing with generics.)

barren shale
#

yeah when u use .net framework 4

rose pawn
#

I miss you guys my nerds

prisma grail
rose pawn
#

✌️

#

how iz life going h*mza

barren shale
#

we are not nerds

rose pawn
#

u are

barren shale
#

we are femboys

rose pawn
#

you are both

barren shale
#

with our programmer socks

rose pawn
#

all femboys are nerds but not all nerds are femboys

barren shale
#

all fenasi kerim are fake

static solar
rose pawn
prisma grail
rose pawn
#

if only I had a spanish girl to do that with

static solar
prisma grail
static solar
#

Same tbh OwO

prisma grail
# static solar Same tbh OwO

Might even be able to keep me sane while I continue to debug the new exceptions that are now arising in my code. OwO

static solar
#

Thigh highs are proven to raise computer science capabilites by 200 % when worn (p≧w≦q)

barren shale
#

that's why i wear two at the same time

#

400% increase

static solar
#

Layering

prisma grail
#

Great strats right there.

prisma grail
# barren shale 400% increase

Ngl, I really could need the skill rn. The code is working when I run it normally, but not when I run it in my mod, and I can't attach a debugger to the game on my Mac.

#

To figure out why.

barren shale
#

wtf

#

Good thing I never got into modding

prisma grail
#

Rn, I literally have to try spamming console logs to try figuring out what's wrong.

#

I am so done rn.

#

It's literally finding them.

#

All.

#

So why is it not being loaded into the config.

barren shale
#

print out the keys of the dictionary

prisma grail
#

Ohhh.

#

Nvm, I'm a huge idiot.

#

I'm literally running this on every config value.

#

Before adding it.

#

To check if it exists.

#

Ouch.

#

I sometimes sure am quite the idiot. wbsuffer

barren shale
#

we all are

prisma grail
#

Fair.

prisma grail
barren shale
#

that doesnt look slow at all xzibit

#

good this only run once

prisma grail
#

Just to always run the exact same code.

barren shale
#

wait what

#

you dont need that

#

configOption does have a value right?

#

configOption.defaultValue

prisma grail
#

And Bind is a generic method.

#

That only supports certain types.

barren shale
#

oooooh

#

create a bind wrapper

#

in the ConfigOption<T>

prisma grail
barren shale
#

oh wait this might not work

prisma grail
barren shale
#

cause you cant cast to ConfigOption<T>

#

i feel like there should be a way to make this work

prisma grail
barren shale
#

which ?

#

terenary or nullable

prisma grail
barren shale
#

oh

#

yeah

prisma grail
#

From Java.

barren shale
#

i guess

prisma grail
#

No bool?, string?, etc possible.

barren shale
#

oh yeah

#

everything is nullable xzibit

#

bool? does exist

#

because its not nullable its a struct

prisma grail
#

You wouldn't believe how common it is for you to make a small change.

#

Just for it to result in some random method by the game throwing an NRE.

#

And the methods tend to be quite long, and stack traces don't show line numbers.

#

So you don't even get to easily find out what's causing the NRE.

barren shale
#

sounds fun xzibit

prisma grail
barren shale
#

dont make anything in python

prisma grail
#

Those two things are pretty much my only personal coding projects atm. TwT

prisma grail
barren shale
#

AMP was a mistake

prisma grail
#

Anyways, want to see what I just went through all of that pain for?

#

All of it just so that I get to have IDE autocomplete for Config values without needing any code duplication for it @barren shale .

barren shale
#

I SOLVED IT

#

I SOLVED YOUR ISSUE

#

omg im the best C# dev

#
public abstract class ConfigOption
{
    public string Section { get; }
    public string Field { get; }
    public object DefaultValue { get; }
    public string Description { get; }

    protected ConfigOption(string field, object defaultValue, string description)
    {
        Section = GetType().Name;
        Field = field;
        DefaultValue = defaultValue;
        Description = description;
    }

    
    public void Bind()
    {
        typeof(ConfigOption)
            .GetMethod("F")
            .MakeGenericMethod(DefaultValue.GetType())
            .Invoke(this, new object[] { DefaultValue });
    }
    
    public void F<T>(T param)
    {
        Console.WriteLine(param);
    }
}
#

F is the test function here

#

instead of calling F you'd call the actual Bind function in the ConfigFile

barren shale
#

notice how this only gives me two options for the string

#

the two options i specified here

#

type inferenace is the heaven C# needs

prisma grail
barren shale
#

have you tried the solution?

prisma grail
#

Lemme give it a shot real quick.

#

I can't even use an ! to surpress the null warning. wbsuffer

barren shale
#

should never be null wrap it in a try catch if you wanna be cautious i guess

prisma grail
barren shale
#

or conditional access if that exist

#

yup

static solar
#

Wait WorldBox modding uses .NET Framework?

barren shale
#

unity does

#

so yeah

static solar
#

Hell no, I am not getting into modding

#

.NET Core all the way

barren shale
#

unity will start supporting .NET Core this year

static solar
#

Took them long enough

barren shale
#

but i dont think wb will migrate

#

even though i think they should

#

at least a slow one

prisma grail
barren shale
#

sure

#

the debt that you will never have to pay

#

must be painful

prisma grail
barren shale
#

gotta go sleep

#

good luck on your .net framework adventures xzibit

prisma grail
#

And the code is working btw! UwU

queen zodiac
prisma grail
#

@barren shale Giving up on improving it for now, but whenever you see this, this that I've got a shot at somehow bypassing C# restrictions by grabbing the MethodBody, stuffing the IL instructions into a DynamicMethod, and then running that?

static solar
tame socket
#

idk can i post here about unity

#

but

#

how to remove this light

barren shale
#

and i dont think it would look cleaner

prisma grail
barren shale
#

Tbh I used to do this a lot but then I stopped and started optimizing on the go

#

Because sometimes you don’t really know how you want it to be in the end

prisma grail
#

Fair, though there's one thing bugging me like crazy about my current implementation.

#

I have these methods that construct the Options for me duplicated in every class.

#

But if I were to move them to a separate utility class, I'd need to specify the section every time, instead of being able to put it into the methods.

#

Theoretically, if I could inherit, this wouldn't even be a problem because I could just get the class name of the specific type as the section.

#

But I can't inherit since it's all static. wbsuffer

#

Wait, nvm, I'm an idiot, I can just make the parent class a singleton.

#

Yeah, ok, nvm all of that, I was just casually forgetting that design patterns exist, Ig. wbtroll

prisma grail
#

@barren shale Turns out that we were being stupid yesterday all along, not C#. Simply gotta add this Select, and C# can suddenly deal with the generic types.

prisma grail
#

Yeah, the only weird generics workaround that's still in there is your Reflection code in ConfigOption.

prisma grail
barren shale
#

Noice

#

So now you don’t need the extra classes?

prisma grail
barren shale
#

Pog

prisma grail
barren shale
#

the power of reflection

barren shale
#

this guy is what aspired me to code in 2015

dusty kernel
wet girder
#

What are you making in Unity?

young flume
#

horror game

#

prob

tame socket
#

in ps1 style

tame socket
#

What do u think

#

(i tired from blender)

barren shale
#

uhmm the lighting

#

is that a model?

tame socket
#

ps1 style

barren shale
#

hmmm

tame socket
#

I can send u more images

barren shale
#

nahhhh im good xzibit

tame socket
#

Damn

#

Im depressed now

spare mirage
#

Yo can I have some C# vs C++ memes lol

barren shale
#

no

spare mirage
prime kiln
#

one of you shut-ins should make an interface ideal for map wars

static solar
#

No experience in graphical design 😔

barren shale
#

we need this in C#

#

this is sooooo hottttt 🥵 🥵 🥵

prisma grail
#

Or Optionals?

barren shale
#

neither

#

i guess its a union type but a specific feature in the union type

#

when actionButton is true, action is defined

#

when actionButton is false, action is undefined

#

so if i check if the action button is true, the typescript language server knows that action is defined in the if statement

#

it makes making optional arguements so much easier

#

so i guess its not neither

#

its both merged together xzibit

prisma grail
barren shale
#

yeah ts type syntax is super confusing

lapis flint
barren shale
#

why almost though

#

ts is the best option for web

#

and a pretty good option for small projects

lapis flint
#

Only c# for now

#

If i will need to do something on js, ts will be used of course

barren shale
#

yeah

#

js is basically unusable for more than 2 files imo xzibit

lapis flint
#

After sb i understood that fully 🫠

barren shale
#

i saw xzibit

barren shale
#

this beautiful piece of art just took 3 hours of my life

#

worth it

lapis flint
#

I made sb and ncms by working on both projects at same time, because i wanted to done them before wb steam release, it was a rush, this is why its not so good 🫠

barren shale
#

yeah when i heard how fast sb was done i was impressed tbh

#

i wouldnt be able to do it this quick

queen zodiac
tropic dagger
#

I'm need to commit to either learning masm or opengl doing both is greatly impacting my sanity I think I'm hearing voices 💀

#

Even just programming. I was awake for like 40hrs the other day just reimplementing C standard library functions to add functionality because I didn't like the current function base's limits

queen zodiac
#

You’ll thank me for this advice later by killing me

#

But heh

#

It’s for science

tropic dagger
queen zodiac
#

You really do hear voices

tropic dagger
#

Plus this is worldboxcord we're all crazy

queen zodiac
#

they might hear you

tropic dagger
#

This resolution of mine came to me in a hallucination

tropic dagger
#

they told me of my purpose

#

It would be unwise to not follow their decree

queen zodiac
#

Let yourself be guided into the grinder

#

Cya in there

tropic dagger
#

Of course

#

Good luck with your mission, whatever that may be 🫡

queen zodiac
#

🫡

wintry maple
#

What should I start eith to learn coding like I assume Python

queen zodiac
vital vector
#

@queen zodiac

wintry maple
#

I wanna start

queen zodiac
wintry maple
#

I wanna be a developer in worldbox team so yeh

queen zodiac
wintry maple
#

Oh so it will take 6 years then

#

Xd

wet girder
wintry maple
#

But isn't game like minecraft made on Java?

#

Oh wait a sec I just realized I need to learn C and c++ before java

wet girder
#

Minecraft is the only big game made in Java

#

Indie games are usually made in Unity with C# including WorldBox

#

AAA games are usually made with C++ using UE or similar game engine

#

Imo C and C++ are not a good starting point to learn coding

barren shale
#

you dont need to learn anything before anything

wintry maple
barren shale
#

you can learn any language at any time

wintry maple
#

Oh

#

I will start with C

#

Then

wintry maple
wet girder
#

C# is for indie games

#

Not C

barren shale
#

C works but its 20x times harder

#

or 100x

#

or 1000000x

#

would not recommend for beginners xzibit

wet girder
#

C is mostly used for embedded

wintry maple
#

C# ohk let's me do a quick YouTube search

wintry maple
#

C# ohk let's me do a quick YouTube search

#

Ohhh

#

Ok then I will go with C#

#

Then

lapis flint
tame socket
#

U can help me improve my goofy ass game

queen zodiac
queen zodiac
tame socket
queen zodiac
wet girder
tame socket
#

Not yet

tame socket
#

rn my only prpblem is

#

mf blender

wet girder
#

relatable

#

I fucking suck at using blender

#

I have friends who are amazing with it but I can barely make anything with it

barren shale
#

its a skill you havent acquired yet

#

go practice

carmine pecan
#

Hi

next shell
#

hi

late torrent
#

Bye

fossil oracle
dusty kernel
#

Hi

lapis flint
#

Hi

queen zodiac
#

Hi 🤖

static solar
#

Hi

rocky elm
#

Hello

alpine cape
warped widget
#

Guys tell me why active all code not work for me @everyonw

fallen siren
#

hello i am new to coding but i know coding but i don't what app to use to code

#

mod

lapis flint
#

But for codding better to use visual studio (not visual studio code)

quartz pumice
#

What

#

I've only had bad experiences with visual studio

#

And it gets worse with each passing version

#

While visual studio code has only done good things for me

#

like that video you haved to fucking deal with all of vs's shit, and it traps you into vs if you don't use cmake

#

And it's broken half the time

#

Meanwhile the only problem I've had with vsc so far is the settings not carrying over instantaneously from wsl to desktop

#

and vsc is 80 gigabytes while vs is 200 megabytes, and mingw64 plus all the libraries I installed make like 50 megabytes

cunning sparrow
#

What languages are y’all using? I’m over here locking in trying to get better at Java

static solar
#

Why does everybody try to learn Java?

queen zodiac
#

I use grass 👍

static solar
#

Like why

queen zodiac
static solar
#

So many people uniformly decide they want to learn it

north galleon
#

Hey I need help with something, if anyone has taken Computer Science A and did the resource finder projects where do you find the data file to start the project, I can't find it anywhere in the page, online, by my teacher, so I'm at a lost

north galleon
#

I've been searching for a solution all day and litterallly nothing about it has come up

#

So I'm slowly going down into insanity

queen zodiac
north galleon
#

Will do, however if anyone knows anyone, tell me

north galleon
#

Another problem I'm having: so I'm tryna make blackjack in Python, but this error keeps coming up AttributeError: 'str' object has no attribute 'point_value' and no matter what I do, any fix, any video tutorials, nothing works

#

So anyone got a solution or tip

quartz pumice
quartz pumice
#

which is weird and why are you programing objects in python at that skill level

lapis flint
#

Why i found out this just now

#

It looks so clear

#

Removes so many repeats

#

By this way c# will looks like js because of lack of types in code

barren shale
#

i prefer var

lapis flint
#

Yes

#

But in intialization for properties it is good

barren shale
#

i guess

#

i always initialize in constructors

#

but yeah its useful if you dont do that

lapis flint
#

In game engines usually initialization of components happens not in constructors

#

Unlike unity godot allows to use constructors but i got used to do it by this way

barren shale
#

yeah i used to use var a lot before new()

#

so i just got used to it

#

too hard to stop a habbit smh

spare mirage
north galleon
#

But thanks for the help

cunning sparrow
tropic dagger
# cunning sparrow I had no choice in the matter- my school has me doing it. But I’m learning C# an...

If your goal is to learn a language, I wouldn't recommend including an intermediary language, especially if the goal is to learn something like C/C++. The features of one language will disrupt your learning of the features of another and playing the de-abstraction game of going from a high level completely object-oriented language to a "mid" level language like C/C++ is very difficult. I'd say focus on C++ now if your goal is to learn C++. This will also make it much easier to learn C# if you want to use C# for whatever reason.
My sith lord advice is fuck object oriented programming, drop out of school so you don't have to learn Java, learn C, and do crazy shit

queen zodiac
#

Holy-

tropic dagger
#

I got carried away but it's good advice I swear 😭

wet girder
tropic dagger
#

You are the enemy

wet girder
#

Also C# is not even close to high level if you comapre it to the likes of JS and Python

#

I do also know how to write C and C++ but I rarely ever use them

tropic dagger
#

Compared to C it is

wet girder
#

fair

tropic dagger
#

I mean fair enough

wet girder
#

but it's pretty mid level language

tropic dagger
#

It's a high mid level

wet girder
#

I can agree to that

tropic dagger
#

Optionally garbage collected

#

🤝

wet girder
#

Tbf I use C# mostly because I got a job where I use it

#

I'd like to get into embedded programming tho

#

which afaik is mostly C

#

But I kinda suck at C rn so I gotta get a bit better in it lol

orchid frigate
#

If you want money => learn c#
If you want fun => dont

barren shale
orchid frigate
#

Assembly 🤭

barren shale
#

Any

tropic dagger
tropic dagger
barren shale
tropic dagger
orchid frigate
orchid frigate
#

Or the basics of memory

tropic dagger
#

My point exactly

orchid frigate
#

Isnt that the opposite of your point

tropic dagger
#

No?

orchid frigate
#

Whats your point

tropic dagger
#

Higher level languages add too much abstraction

barren shale
#

It didn’t matter what language the previous experience was in

orchid frigate
tropic dagger
tropic dagger
#

I learned a lot more focusing on C++

barren shale
orchid frigate
#

Transitioning from c# to c++ took me a week at most

#

The first time

tropic dagger
orchid frigate
#

Well you learned the two highest possible language

tropic dagger
#

This is true

orchid frigate
#

And then switched to c++ obviously it's not gonna be a breaze but still

#

It was definitely easier than goikg from nothing to c++

tropic dagger
#

Responses will slow

#

Sorry I'm boarding my bus

barren shale
#

I used to think it would be harder to transition from high level to low level

#

But after teaching all of these people it turned out that it’s the opposite

orchid frigate
#

Its def the other way around

#

Going from c to c# is such a headache

#

And js is just js

#

Its not even a topic

barren shale
tropic dagger
barren shale
#

Having any programming experience makes it easier

#

It doesn’t matter what the language is

tropic dagger
#

It makes learning syntax easier

orchid frigate
barren shale
#

Most languages have the same syntax

orchid frigate
#

Functional to oop is 😶

barren shale
#

And it takes a couple of days at most to learn a syntax as someone who never looked at code before

tropic dagger
lapis flint
tropic dagger
#

I mean, kinda, but even C and C++ are very distinguishable

orchid frigate
#

Python was never supposed to be created

#

I fucking hate it

barren shale
tropic dagger
#

Python is a great scripting and prototyping language

orchid frigate
#

Gcc and compile c++ code and the other way around

barren shale
tropic dagger
orchid frigate
#

I learned g++ exists a few months ago

tropic dagger
#

gcc is the compiler collection

#

It includes G++

orchid frigate
tropic dagger
cunning sparrow
orchid frigate
#

The only difference they have is c++ has shitty oop noone uses and structure declaration

tropic dagger
tropic dagger
#

And namespaces

barren shale
#

That’s the point of cpp

tropic dagger
#

C++ has strayed from C in many ways

barren shale
#

Idk these days I feel like it’s a waste to use C/C++ for anything not embedded these days

#

Low level?

#

Go or rust

#

Super fast

#

Way better DX

orchid frigate
tropic dagger
#

I disagree, the problems rust solves are not worth writing such ugly code 😭

orchid frigate
#

UGLY????

tropic dagger
#

I should learn rust eventually

orchid frigate
#

Nah bro you dead to me

tropic dagger
#

😭

barren shale
#

Writing rust is still way better DX than C/C++

orchid frigate
#

You dont fucking insult my baby and get awya bro

barren shale
#

DX is really important

#

You don’t wanna spend 7 years writing your code xzibit

tropic dagger
barren shale
#

Rust isn’t oop

tropic dagger
#

It isn't?

orchid frigate
#

No

barren shale
#

No

tropic dagger
#

Holy fuck

orchid frigate
#

Its perfect is what it is

#

It has very very very powerful structures which are basically like objects

tropic dagger
#

Now if only it looked like C++
Unreadable syntax sugar my beloved

barren shale
#

Not really

orchid frigate
#

Wdym not really the entire language revolves around them

orchid frigate
barren shale
tropic dagger
orchid frigate
tropic dagger
#

Well, not basically

#

Objects contain behavior

barren shale
#

But yeah C/C++ should not be used in 2024 aye

tropic dagger
#

If there are member functions then it's an object

orchid frigate
barren shale
#

No excuses to use them

barren shale
tropic dagger
#

I think rust should set an example

#

It shouldn't replace anything

barren shale
#

It’s not about replacement

#

It’s about DX

tropic dagger
#

That's exactly what you're saying 😭

orchid frigate
#

Also if you need to mix assembly its better to go with c/c++

queen zodiac
#

I learned something useful from this conversation: y'all can't shut up

barren shale
#

You can write code faster in rust or go

orchid frigate
#

Because the rust way of transitioning to assembly is

barren shale
#

And it doesn’t run slower than C/C++

orchid frigate
#

Not great

tropic dagger
orchid frigate
tropic dagger
barren shale
#

Yeah C/C++ still have their uses but “I want my code to run fast” is no longer one of them

orchid frigate
#

Yes I took alot of brainpower to make that up

barren shale
orchid frigate
#

In fact I took so much brainpower im tired now

#

I will go chill

tropic dagger
queen zodiac
tropic dagger
tropic dagger
#

Obviously I need to learn Rust

fallen siren
#

tell me is something wrong?

tropic dagger
#

It's not in any of my projects

barren shale
barren shale
fallen siren
barren shale
#

Or you will be like the Java and php devs xzibit xzibit

queen zodiac
fallen siren
barren shale
tropic dagger
#

No need to write a scripting language for modding/general usage when there's already a very powerful language hanging around that has all the features I'd want heheh

cunning sparrow
queen zodiac
cunning sparrow
queen zodiac
barren shale
#

already said why

#

not gonna type it again xzibit

quartz pumice
#

What if the only modern language I like is Zig?

#

💀

barren shale
#

C/C++ wont stay with us forever

#

new companies are not using them and old companies are switching to more modern languages

#

microsoft switched some services from C#/C/C++ to rust the last couple of weeks

lapis flint
barren shale
#

and C/C++ will stay

#

but what percentage will be using them?

#

its growing smaller by the year

#

"growing smaller" xzibit

#

there are still apps written in visual basic in my country

#

and they get maintained

lapis flint
barren shale
#

@queen zodiac you always here?

lapis flint
queen zodiac
orchid frigate
orchid frigate
#

Zig is like if rust and c had a baby and it was beautiful

queen zodiac
orchid frigate
#

And they named her "Isabella" and she grew up to be the queen of some big ass kingdom

#

Thats how I imagine zig as a person

orchid frigate
# queen zodiac Easier said than done

You go to a group of people talk to them for 20 minutes they start yapping about the last party they threw you get interested they ask wanna come to the next done

#

Its literally that simple