#dev-general
1 messages · Page 215 of 1
I heard java 16/17 will have a memory api or smtng
@steel heart doesn't it already?
that's what Unsafe is
I think they are working on value types
@steel heart Nope doesn't work with EventExecutor either
[18:34:29] [Server thread/WARN]: org.bukkit.plugin.IllegalPluginAccessException: org.bukkit.plugin.IllegalPluginAccessException: Unable to find handler list for event org.bukkit.event.Event. Static getHandlerList method required!
interesting
Can't register a lsitener for abstract Event classes
Hm aparently you can't listen to all events, you have to specify which events you want to listen to specifically
@empty flint
You can
@steel heart
Bruh...
Yeah my bad
But you can handle all of them
@steel heart How do you handle them when you can't listen to them?!
unless you have a listener for each Event that you can listen to and point it at the same executor, you can't do it
and at that point what the fuck would I need an executor for?!
class A implements Listener, EventExecutor {
public void execute(Listener listener, Event event) throws EventException {
if (event instanceof PlayerEvent) {
event.doSomethinr();
}
}
}```
Then register the same instance both as listener and event executor iirc
did just that
Send what you did then?
class Executor() : EventExecutor, Listener
{
override fun execute(listener: Listener, event: Event)
{
println("executing event: ${event.eventName}")
}
}
And how did you register it?
pluginManager.registerEvent(Event::class.java, executor, EventPriority.MONITOR, executor, BlockyDebug.instance)
which of course does not work as I found out because you can't register for the Event class
because it has no HandlerList
idk, do you?
Wth
Wth
@steel heart yes...?
I mean it’s good it doesn’t work but that’s odd, worked for me last time I tried
but yeah... If I knew how to generate classes and inject them into the classpath, I could do that by just browsing through all subclasses of Event, but I don't, so I can't
but yeah... If I knew how to generate classes and inject them into the classpath, I could do that by just browsing through all subclasses of Event, but I don't, so I can't
@empty flint bytebuddy or cglib + org.reflections / classgraph. They're both pretty big though so maybe not the best option
you could probably make a compiler plugin to do it
yes
Or what I could do is write an ant script or something similar that creates the files I need
one of the popular ones
as actual kotlin class files
before compilation
or maybe in groovy even
as a build task
yeah...
Asm is great 🥺
When I hear ASM why do I think of assembly
mhm good old cyebrsluts
Hold on

The searches which have came up will be based on your cookies
exposed

no
i spoke to the ceo of google and he said that is not true
😬
Please enter a valid credit card.
no
Yes.
😨
Are you older than 18
No
Proceeds to take you further into the site and says you have passed the test.
Are you prepared to see HOT SINGLES in your area?
@light venture Fucking weak, not even a number starting with 069
BM, ah yes that ad, hot singles in your area, 2km away and you check the location and it's in the middle of a forrest 
rofl
there are 463 singles waiting in the forest for you!
all hanged on trees
Jesus
frosty the serial killer
kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Unresolved class: class org.hotswap.agent.watch.nio.AbstractNIO2Watcher$1
Anybody have an idea what that might be?
classes
.filter {Event::class.isSuperclassOf(it.kotlin)}
.forEach {
println(it.name)
}
occurs when executing this piece of code
looks like hotswap agent is interfering (obviously), maybe it gets removed from the classpath after hotswapping or something
if it's still working you can probably ignore it
hmm
to print all the class names
wrap in a try/catch and ignore while debugging?
classes
.filter { it.name.startsWith("org.bukkit.event") }
.filter { Event::class.isSuperclassOf(it.kotlin) }
.forEach {
println(it.name)
}
this solves it
pre-filtering the superclass/subclass filter
interesting
wonder what causes that
I presume it.kotlin is the source of the problem
probably to do with all of the JVM hacks that hotswapagent does not working with kotlin
maybe, yeah
it is a Class in this case
doesn't really matter now
Do you have an idea what the best way to use kotlin reflection and the bukkit api would be in order to generate .kt files automatically before compilation? Like in a gradle task?
I am using gradle with groovy to build my project though, I don't know how to combine the two exactly
Or if that's even a good idea
i'm not sure how possible that is
codegen is possible, but i'm not sure if it can access classes from dependencies or not
You may want to look into KotlinPoet, that's a pretty nice library for generating kt files
I will take a look, thank you!
@prisma wave is it possible to write a gradle task in a task.gradle.kts file and use it from a groovy build.gradle skript?
I believe so
Logger can be static, why try-catch exception? Maybe make that string a constant?
Will setPlaceholders ever throw?
Anyone have any ideas why none of my plugins or world is not generating?
It's on a bungee server so I cant even connect to it.
That looks like a vanilla server no?
that 100% is a vanilla server lmao
There is no spigot for 1.8.9
Ahhh.
Will
setPlaceholdersever throw?
@ocean quartz Yes lol. That's why I built that whole expansion detection thing
Unless you have a real reason to catch it, don’t
I mean it'll only "throw" on errors right? If that's the case there isn't really a reason for that
You’re still printing the stack trace
Yeah so they know what to go off or whatever
If I don't print it we get the whole "no stacktrace cant fix it" thing
then wrap it instead
Wrap?
Just printing it won’t do any difference
Yeah create a KiteboardExpansionException that extends RuntimeException and throw new KiteboardExpansionException(exception);
I can’t see any other reasons why you would catch such a generalized exception
If it’s not for wrapping to tell anyone where the original exception came from
🤨 I am catching it because this happens often and 100% of them time it's caused by the placeholder EXPANSION- and it gets sent to me when it should go to the expansion author.
I mean do it if you feel like it benefits you I guess
Well it prints:
[KiteBoard] *********************************************
[KiteBoard] FAULTY EXPANSION: Vault
[KiteBoard] CONTACT AUTHOR: clip
[KiteBoard] *********************************************
To help the user I guess
Ok
Is that all you have to say for your self !!
Well, what do you want me to say?
Idk sorry, excuse me
The code isn’t bad, in my opinion very solid and good
🥰
But can’t review on spigot since I don’t have the resource 
100% Solid code
Just to verify
PacketPlayOutEvent is the packet I want to use if I want to send only a specific player a glow packet for a specific entity
PacketPlayOutInEventActionInteractJoinEventOut
;)))))
You guys think we should only support 1.15 and 1,16
For the plugin at least for now
okay what the fuck
I literally deleted the files from the local repo
and it's grabbing it still.. from somewhere
You wanna know why I removed support for versions below 1,15 in the npc lib
sure ig lol
🤣
Besides that lmao
fuck 1.12 users?
BuildTools wouldn’t work for me so I couldn’t make 1.14.4 build
Yep
Yeah
Lol
lol
Wait dude
Fuck all
I use java 8
Server owners

I meant server owners who are lazy to update their java
More precisely
xD
Not you
Basically very hard
And probably it’s obnoxious as well
lol
Smart casting?
In java at least
I wouldn't call that smart casting
Auto casting
if (obj instanceof String text) is more like reassigning than smart casting
Kotlin has it though
if (obj is String) // obj IS String
Yeah
Yes
Definitively
Once you do Kotlin you don't want to go back
So it’s a drug?
Worse
And coroutines 
Lol
Java is a nimcompoop ngl

Having a weird issue where spawning lightning strikes has the effects but the strike itself isn't showing
Smart casting
@forest pecan java already has smartcasting... smh
#showcase message
@prisma wave Disclaimer: All your classes must extend Throwable
Lol
Thats because Spigot is garbage
@quiet sierra you better update that windows sir
Been like this for a week
do u ever turn ur pc off?
lol
A custom entity
That has a PathfinderGoal
That plays particles and smites all nearby entities
Could be a boss idea
oh I see
god damn update and restart before i smite you
Lolno
lollater
ha then restart
bite an onion
yuck
vitamins
i’ll bite you 🧛♂️
hola senior citizen
is it just me that checks for updates like every day?
I also did update my work laptop but it prompted an update legit 5 mins later
😂
keep it up to date and it wont happen 🙂
although that shouldnt happen anyway, gj microsoft
we love microsoft
Does the MIT license prevent someone from just copying your work, rebranding and selling at shady prices?
I don't want other people to be essentially "scammed" or "ripped-off" for something which is already open source and accessible by the public
MIT is basically, take the code and do what ever you want with it
I don't want other people to be essentially "scammed" or "ripped-off" for something which is already open source and accessible by the public
The best alternative to that would be imo GNU GPL v3
It allows for private use, but any public distribution has to be open source
Tbh you're kinda forced to do GPL or GPL compatible stuff, if it's Bukkit related
Yeah true
lol bukkit is a maze full of licenses
its a gray area
Nah, bukkit is officially GPL, so anything you do with it has to be GLP compliant
Thank Grum for it
mhm hmm
when i mean gray area, i meant more like some authors dont even do open source
which is annoying
Yeah, the thing is, you can do what ever just because no one will take you to curt over a plugin 
the sad truth
Nah, bukkit is officially GPL, so anything you do with it has to be GLP compliant
Take into consideration that (depending on what your plugin uses from Bukkit) you are also including a lot of licenses from other libraries as well
Hey epic gamers! I have a bunch of domains mydomain.com and anotherone.net
Is it fine to use "mydomain" and "anotherone" as ftp / ssh usernames or is that considered a security risk?
As far as I understand, it is not disclosed whether a username exists via ftp / ssh, is that correct?
Obviously I'm using strong passwords.
it would be easier to guess, but as long as you have strong passwords (and potentially a honeypot) you're probably fine
Obviously consider SSH keys if possible
noni install fail2ban 🙂
2FA 
WtF
Required type: ?
Provided: ?
makes sense
fuck
lol
is broken
https://i.imgur.com/Tuai8bE.png
@static zealot ooo me too!
agian"?
why is like when i do
if(args.isNotEmpty()){ args.removeFirst()}
throws error?
java.lang.UnsupportedOperationException
at java.util.AbstractList.remove
@dusky drum what is args?
It would appear it's some sort of list
fixed apparently it yes just didnt want to work
My github was forking a bunch of shit for no reason
probably because I keep misclicking
We should make this a faq, to show people that are just starting
https://www.youtube.com/watch?v=vVRCJ52g5m4
faq's actually help a ton from my experience
they help prevent you from losing your brain to people who are like
when is going to be the next update
how much longer?
where to start code?
why legacy not supported?
where to start code?
Basement
start code while still a fetus
Will it handle callback hell as well?
Yo fr
but it will
Could be with generics
[code=elara]
let efefury = "uno card"
print("@efefury" + efefury)
[/code]
@obtuse gale
Considering flatMap or that concept (:
flat-map according to elara naming conventions 🙂
Ah yes sorry

optional semicolons 🙂
👏
let result = executor.spawn {
do-something-heavy()
}
result.when-complete {
print("yay")
}```
elara
uh
yes
"" for string literals
I still hate the -
no its stupid
its like a pain in the ass to type
possibly
the -_ button specifically is very annoying to press
only because you're not used to it
and i dont wanna get used to it
😦
id rathe use -
for some reason i use caps lock instead of shift for uppercase letters 
let handlableFuture = executor.common.supply {
thread.current.sleep(1000)
return "lol"
}
handlableFuture
.handle { context ->
if (context.has-error)
print(context.error)
context.result { it ->
print(it)
}
}```
Or smtng perhaps lol
or maybe more specific like handleError, handleResult etc
And yeah, i'm still not sure i like the - or not myself lol
hmm possibly
we've not really thought it through that much
maybe something like kotlin has
maybe
might as well start using -> for accessing members
or uppercase
tbf the only reason I chose it was because repl.it competition said the language should be unique lmao
Here is a nitpick with - that would bother the hell out of me
good point
I mean it can be good thing which could have the same function as . for indexing methods
wdym
he probably means it's good since you want to change 'optional' to e.g. 'double' rather than the entire create
however that use case is relatively small
compared to wanting to change the 'create' / the whole thing
yeah generally I think you'd want to change the whole thing
I guess if we decided to stick with - for whatever reason, it could be mitigated with a plugin
@old wyvern
@errant geyser thoughts?
For me is just that i like to simply double click copy and paste to use again, or to rename or delete, which wouldn't work with -
Or rather ide feature
absolutely not
WHOS THERE?
where when
what why how
🌝
knock knock
whos there
where when
where when who
Ultimate pickup line if you ask me
nah
Kali, gimme something better then.
clojure without parentheses
defn main [& args]
println "Hello"
``` indentation based 🙂
Leave.
(Java, Spigot Plugin Development)
How do I wait for a line of code to finish executing, before executing the next line?
synchronization
Speaking of cursed, a reminder that this is possible
are you like running a task and you want it to complete before you continue?
Lol
Should make a plugin written entirely with emojis
Or just a Future maybe 
Should make a plugin written entirely with emojis
you wont :)
Is that a challenge?
@ocean quartz reminds me of this image xD
LMAO
(I lied it was this one actually)
xDD
Well I mean.......... typedef 🙂
I'd quit the interview 
Kekw
@lavish notch it always will wait unless you're dealing with async stuff
You can achieve weird code execution order by using a lot of functional interfaces iirc
clython 🙂
Jython
Lol
<T> @Nullable Collection<T> or @Nullable <T> Collection<T>?
good boy
its not the type, its the actual variable shitty thing lol
as if the compiler cared lol
XDDDD
change your name dude
LOL
.
CONCLURE
lol?
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻
😤
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
NOOO
(╯°□°)╯︵ ┻━┻
(╯°□°)╯︵ ┻━┻
Every one really down voting mitten
It's wat u deserve
modern society
plane / minecraft build / "art" - 3000 thousand upvote
gojure - 6 downvotes 😦
┬─┬ ノ( ゜-゜ノ)
😠
wat
Bruh r u old?
@steel heart I am 😢
Stfu
sTfU
lol
lol
how old
im not 12 lmfao
-1
im 29 :Kapp:
@obtuse gale
i
e^i
that means you arent born yet
i^i
The specimen is like 12 years old I guess
(Pulse)
1..100
Hey i have a question, i want to change ranks of the player of my server, but i only know how to create "command /rank", please can somebody help me to create a command "/rans <player>", to open a custom gui please. Ty.
(-1)^(1/2)
Σ(λ^ λ)
λ=0
#development @hazy cape
ok ty
3.14159265359
@obtuse gale terminated number
its not pi tho cause pi has infinite
digits
lol
its just a decimla
i cant sepll
Lol
You’re like 937473736
937473737
69?
too much hmmm
Damn
the oldest human was 122
you must uh
have very good health
Pls no

You’re by definition 12 as well
No
Change my mind
Im actually
Ok pulse you can be 13 I guess
I can't actually remember how old Conclure is
@steel heart https://imgur.com/a/qd3Dsvq (:
Property get invalid
It’s actually higher if you don’t count all the people who tends to shoot themselves
GC.clear(wtf);
a ❤️ b = a + "is" + b
ab
Conclure ❤️ gay
Boom
how does it feel
to delete the space
I crushed all your life dreams
by pressing delete
😮
sout(delete)
oh wait
Fub
Kekkkkk
┬─┬ ノ( ゜-゜ノ)
┬─┬ ノ( ゜-゜ノ)
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)

Lmao
"wtf?"
┬─┬ ノ( ゜-゜ノ)
┏━┓┏━┓┏━┓ ︵ /(^.^/)
┻━┻︵ (°□°)/ ︵ ┻━┻
:spam:
@obtuse gale 
Im lovin it
Same
Better than oracle themselves
static abuse
<33333
i read his/her code now
and i cant understand a thing now cause its so cmplex
lmfao
Not even static abuse in the ss, just exposing fields, this ain't kotlin boyo
Someone should go judge my potato code 
i'm going to fork potato
in the ponclure organization
Lol
Thought that was something else first lol
kekw
Imagine embeding the image shitty discord
lol
NO
@obtuse gale Ikr i hate when people ping
I should delete that fucking branch
Ok @ocean quartz I think @obtuse gale likes it though
that's it I'm deleting that stupid branch
Ok @ocean quartz I think @obtuse gale likes it though
@steel heart Think so?
@ocean quartz according to my calculations
∛λ=Yes
@steel heart I hate you ❤️
@steel heart please tell me that is not your IDE 🤢
What
With my github packages, I published it and added it to my project. When I use a method, the parameters are all messed up
How do I fix this?
sellGUI.generateFiles();
sender.sendMessage(configReloadedMsg);
the first line is async, the second isn't. How can I make the second run after the first has complete?
CompletableFutures
CompletableFuture :^)
:^)
How do I use that?
@runic flume what’s the issue?
Fefo can u give an example, on phone
But when I add the repo/depen to my project and implement/extend the class, the paramter names are fucked up
It’s autogenerations by the ide
Fefo can u give an example, on phone
@steel heart same lol
https://luckperms.net/wiki/Developer-API#using-completablefutures
Check that out @lavish notch
how can you unit test functionality based on random numbers
Just with regular GitHub packages
I published my lib for commands etc, to a GitHub package
Added te repository and dependency to my proejct's pom.xml like any other maven thingie
Then some weird ide setting
How do I use that?
@lavish notch
CompletableFuture<String> completableFuture
= CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Void> future = completableFuture
.thenAccept(s -> System.out.println("Computation returned: " + s));
future.get();
hmm
can you
you’d use whenComplete though
What is that commands library called
Matt something
I am trying to look for the documentation of that online but I can't find it
?mf
Looking for useful libraries/frameworks?
Here are some which have been deemed useful by the community and are used daily.
-> Menus: https://mf.mattstudios.me/mf-gui/gui
-> Commands: https://mf.mattstudios.me/mf/mf-1/getting-started
-> Messages: https://mf.mattstudios.me/message/mf-msg
Oh nice thank you
you’d use whenComplete though
eeeh depends
does anyone else's IJ have a 10 second lag spike when editing material constants or is that just me
I have experienced that before
quite annoying
possibly
does anyone else's IJ have a 10 second lag spike when editing material constants or is that just me
yeah same
Try to dedicate some more ram to IJ?
didn't work for me :((
so I turned it down again :kek:
I use IntelliJ community from 2016 which for reason is significantly better
wut
Anything past 2018.3.6 is bad
lol
Odd flex
does anyone else's IJ have a 10 second lag spike when editing material constants or is that just me
@prisma wave lol bad pc
😦
First head over to #spigot-linking then #deluxechat
Second: english 👀
Ugh this is annoying
super(this)
Nah super(something, new Something(this))
I mean it makes sense lol
Yeah, but it's annoying
Found a way around it 
Anyone have a bot like the Barry bot with levels and badges and such?
No Barry and only Barry is Barry
import elara/barry
barry.run()
You gotta stop BM
So, I've added the B-Stats graph to my plugin page on SpigotMC, but the data is shows doesn't match up to the b-stats page - any ideas for what I've done wrong?
Spigot Page: https://www.spigotmc.org/resources/shopguiplus-sellgui.85170/
Image link on the plugin page: https://bstats.org/signatures/bukkit/ShopGUIPlus SellGUI.svg
B-Stats Page: https://bstats.org/plugin/bukkit/ShopGUIPlus SellGUI/9356
let String[] arr = {"Hello", "World"};
System.out.printfn arr |> Arrays.stream |> Stream.map String.capitalize |> String.join " ";
Javaf# 🙂
public static fn main(args: Arr<&'a str>) {
System.out.println!(&"Hello World".unwrap().as_ref());
}
Rava / Just 🙂
Brister, do you any ideas about my issue above?
Oop- never mind, I guess it was just my impatience
yeah I was gonna say it's probably just caching
okay so c# question
I have date in format 010107(mm,dd,yy) and time in format: 120000 (hhmmss)
how can i convert that to actual datetime class
int mmddyy = 010107;
int hhmmss = 120000;
int year = 2000 + mmddyy % 100;
int month = (mmddyy / 100) % 100;
int day = mmddyy / 10000;
int hour = hhmmss / 10000;
int minute = (hhmmss / 100) % 100;
int second = hhmmss % 100;
DateTime date = new DateTime(year, month, day, hour, minute, second);
@dusky drum
interesting
i get year 2008 XD
i belive my machine can have wrong dating then or something idk
wait really?
weird
why do you have mmddyy and hhmmss seperate anyway
like where do you get those values from
Wait Mackenzie is shopgui+ author? woo
No lol
Yes lol
wdym yes lol, he's not
I mean yeah anyone can do that right there, but how likely is it they will for something like.... bstats.?
His plugin ShopGuiPlus SellGUI
You idot
yeah fucking kill me already
I'm not talented enough to make such a good plugin lol
Kotlin + Python?
lmao
java devices run on 3 billion
"Jotlynthon" sounds like some sort of British sport lmao
Does anyone know a software / system where the system automatically call people or something ?
JoT lin thon
that is a language
`elara mittenToday at 14:12
public def main(String[] args: Array<out String> : Unit :
System.out.print(f'Hello $args[0]');
}
Jotlynthon 🌚
Last one, I promise`
Bruh
I'm looking for software not languages xd
Don't use Junit on plugins right
Depends
I use junit quite often
(╯°□°)╯︵ ┻━┻
┬─┬ ノ( ゜-゜ノ)
I mean unit testing is.. for.. individual units
Can you even do junit testing on minecraft plugins?
Yes
like make a dummy player
MockBukkit can do that
for that matter just throw the plugin into the server and do the thing lol
Imagine not spending hours making a test suite to test stuff that already works
MockBukkit can do that
Lol someone even uses that?
Bro i can't
this kid is asking me
how to add maven repo for spigot api
into online ide
with brain
Lmao
Lol someone even uses that?
@steel heart only when absolutely necessary
It kinda sucks ik
kinda hacky 👀
Adventure users, is it a viable alternative to bungee chat api in 1.8?
Because the 1.8 ComponentBuilder sucks
Not really, you can probably find a api but thats it except legacytext
Hmm I haven’t used adventure api but probably not
Un
Hm*
Idk why it's so hard to append a BaseComponent to a ComponentBuilder
I guess I'll just use reflection
Lol
Adventure users, is it a viable alternative to bungee chat api in 1.8?
Because the 1.8 ComponentBuilder sucks
@prisma wave as an overall experience, I do tell it is a better API, the component building is more "predictable", it has build-in translatable component argument replacement, it has recursive components text replacement, it has minimessage with gradients support
and you can very easily create hover events 👀 you just TextComponent#asHoverEvent()
That sounds good but seems like overkill for my requirements
Hashtag @prisma wave 4 admin
he has half a billion messages here the guy deserves it
I literally just need to append a few BaseComponents together
I mainly switched to it because of this
> the component building is more "predictable"
it makes more sense, you can specify individual components' colors/decorators, nested components don't "leak" their colors/decorators onto the parent component, I had to make a lot of workarounds with bungee's componentbuilder to make that work (with a lot of hacky whacky formatretention bs)
> recursive components text replacement
and this too
lol
had to make even more hacky whacky workarounds with bungee chat api to recursively replace something as simple as a {0} argument
holy shit my brain hurt that time
Yeah the bungee API sucks
But I'm not sure it's worth switching everything over for a simple task
try it out
with the bunge api I had to make 12 utility methods to make component building easier lol
with adventure, only 2
besides
with adventure I don't have to do fucking this
=paste
Please use a paste service to share configs, errors, code and long logs.
• HelpChat Paste
🥶 good point
Hmm, I want to get my main class instance into another class, but it's a superclass (Pretty rusty, think thats what you would call it) that I'm gonna be making a lot of instances of and want to store instances of, and that's really one of the reasons I don't want to do the method where you pass the main instance into the constructor, is there a different way of doing it? I know I could make a static instance of the plugin but I hear that's not the preferred way.
wait are you sure that it's a super class?
hopefully not of your main class right..
could use a dependency injection library like guice or dagger or whatever else that's on the market. And otherwise you'll need to use manual DI or a singleton for example
but why do you need your main class in another class, like what does it need from the main class?
Dagger 🤮
any dependency injection library is ew
just learn go





