jfabry / liverobotprogramming Goto Github PK
View Code? Open in Web Editor NEWLive Robot Programming
Home Page: http://pleiad.cl/lrp
Live Robot Programming
Home Page: http://pleiad.cl/lrp
Machines that are nested in a given state should be shown on mouse hover or
click, ideally with updating of the active state et al.
Original issue reported on code.google.com by [email protected]
on 6 Aug 2014 at 7:11
Such that after (eg) one second there is no more movement in the visualization
Original issue reported on code.google.com by [email protected]
on 12 Jun 2014 at 3:28
What steps will reproduce the problem?
Have the evaluation of a block throw an error
What is the expected output? What do you see instead?
The error message should also include the printout of the block
Original issue reported on code.google.com by [email protected]
on 4 Jun 2014 at 7:29
What steps will reproduce the problem?
code:
(var leftmotor := [motor1])
(var rightmotor := [motor2])
(var bumper := [sensor1])
(var light := [sensor2] )
;need to map ST code sending messages to more PhaROS type style of code
; calibration ''constants''
(var maxlook := [100])
(var lightthresh := [128])
(var backdist := [10])
(var turndist := [100])
; a state machine with name follower
; see below how to kick it into action
(machine follower
(state moving
; what to do when entering the state. always completely executed
; [] is a Smalltalk Block
(onentry [leftmotor forward . rightmotor forward])
; what to do when leaving the state. always completely executed
(onexit [leftmotor stop . rightmotor stop])
)
;a transition triggered by outofline event
; from moving state to looking state
; we call it tlooking
(on outofline moving -> looking tlooking)
(on intheline looking -> moving tmoving)
;events happen whenever their condition evaluates to true
(event outofline [light read > lightthresh + 10])
(event intheline [light read < lightthresh - 10])
(state looking
(machine lookalgo
(var time := [maxlook])
;timeout transitions
(ontime time lookleft -> returnleft t-returnleft)
(ontime time lookright -> returnright t-returnright)
(ontime time returnleft -> lookright t-lookright)
(ontime time returnright -> lookleft t-lookleft)
(state lookleft (onentry [rightmotor forward]))
(state returnleft
(onentry [rightmotor back])
(onexit [rightmotor stop]))
(state lookright (onentry [leftmotor forward]))
(state returnright
(onentry [leftmotor back])
(onexit [leftmotor stop . time := time * 2 ]))
)
;spawn the lookalgo machine, start in the lookleft state
(onentry (spawn lookalgo lookleft))
(onexit [leftmotor stop . rightmotor stop])
)
;wildcard transition, only allowed in from
(on bumping *-> bumpturn t-bumpturn)
(on ending *-> end t-end)
(var hasbumped := [false])
(event bumping [hasbumped not & bumper isPressed])
(event ending [hasbumped & bumper isPressed])
;epsilon transition: happens without an event,
;after source state onentry is done and there is no nested machine
(eps bumpturn -> looking t-looking)
(state bumpturn
(onentry [rightmotor backward: backdist .
leftmotor backward: backdist .
bumped := true .
"how to wait for the two motors to finish??"
rightmotor backward: turndist .
leftmotor forward: turndist]))
(state end (onentry [rightmotor stop . leftmotor stop . sound beep]))
)
;GO!
(spawn follower looking)
What is the expected output? What do you see instead?
System error handling fails when handling MNU NewValueHolder>>forward
Original issue reported on code.google.com by [email protected]
on 12 May 2014 at 6:17
What steps will reproduce the problem?
(var leftmotor := [motor1])
(var rightmotor := [motor2])
(var bumper := [sensor1])
(var light := [sensor2] )
;need to map ST code sending messages to more PhaROS type style of code
; calibration ''constants''
(var maxlook := [100])
(var lightthresh := [128])
(var backdist := [10])
(var turndist := [100])
; a state machine with name follower
; see below how to kick it into action
(machine follower
(state moving
; what to do when entering the state. always completely executed
; [] is a Smalltalk Block
(onentry [leftmotor forward . rightmotor forward])
; what to do when leaving the state. always completely executed
(onexit [leftmotor stop . rightmotor stop])
)
;a transition triggered by outofline event
; from moving state to looking state
; we call it tlooking
(on outofline moving -> looking tlooking)
(on intheline looking -> moving tmoving)
;events happen whenever their condition evaluates to true
(event outofline [light read > lightthresh + 10])
(event intheline [light read < lightthresh - 10])
(state looking
(machine lookalgo
(var time := [maxlook value])
;timeout transitions
(ontime time lookleft -> returnleft t-returnleft)
(ontime time lookright -> returnright t-returnright)
(ontime time returnleft -> lookright t-lookright)
(ontime time returnright -> lookleft t-lookleft)
(state lookleft (onentry [rightmotor forward]))
(state returnleft
(onentry [rightmotor back])
(onexit [rightmotor stop]))
(state lookright (onentry [leftmotor forward]))
(state returnright
(onentry [leftmotor back])
(onexit [leftmotor stop . time := time * 2 ]))
)
;spawn the lookalgo machine, start in the lookleft state
(onentry (spawn lookalgo lookleft))
(onexit [leftmotor stop . rightmotor stop])
)
;wildcard transition, only allowed in from
(on bumping *-> bumpturn t-bumpturn)
(on ending *-> end t-end)
(var hasbumped := [false])
(event bumping [hasbumped not & bumper isPressed])
(event ending [hasbumped & bumper isPressed])
;epsilon transition: happens without an event,
;after source state onentry is done and there is no nested machine
(eps bumpturn -> looking t-looking)
(state bumpturn
(onentry [rightmotor backward: backdist .
leftmotor backward: backdist .
bumped := true .
"how to wait for the two motors to finish??"
rightmotor backward: turndist .
leftmotor forward: turndist]))
(state end (onentry [rightmotor stop . leftmotor stop . sound beep]))
)
;GO!
(spawn follower looking)
-Notice is the fix'd version of the code at issue #13, explained at issue #16,
comment #2.
What is the expected output? What do you see instead?
It shouldn't fail as an UI error.
The error: MessageNotUnderstood: receiver of "detect:ifNone:" is nil
Original issue reported on code.google.com by [email protected]
on 19 May 2014 at 3:58
What steps will reproduce the problem?
Code:
(var count := [0])
(machine m
(state start
(onentry (spawn plus reset))
(machine plus
(var dummy := [0])
(state reset (onentry [count value: 0]))
(eps reset -> p t-rp)
(state p (onentry [
count value: count value + 1.
dummy value: dummy value + 1]))
(ontime 500 p -> l t-l)
(state l)
(eps l -> p t-p)
))
(state re)
(eps re -> start t-s)
(on toomuch start -> re t-s)
(event toomuch [count value > 10])
)
(spawn m start)
What is the expected output? What do you see instead?
Both count and dummy should never be higher than 11 because they are explicitly
and implicitly reset when the nested machine is spawned. But that does not
happen.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 3 Jul 2014 at 8:16
What steps will reproduce the problem?
Edit a large piece of code, put the cursor in the middle of the textfield and
type.
What is the expected output? What do you see instead?
Editor scrolls such that the cursor is on the last line. Editor should not
scroll at all
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 12 Jun 2014 at 8:16
What steps will reproduce the problem?
Code:
(machine m
(state foo (onexit [Transcript show: '-']))
(state bar (onentry [Transcript show: '+']))
)
(spawn m foo)
Right click on the highlighted state.
What is the expected output? What do you see instead?
There should be a context menu, but there isn't.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 2 Feb 2015 at 10:54
Found while re-implementing some behavior. I got a DNU because there was still
an interpreter process running around when all UI windows were closed.
We should register a handler on UI close and when that happens pause the
interpreter.
Original issue reported on code.google.com by [email protected]
on 8 Jun 2014 at 12:53
Right now all variables in scope are passed to the block. This should be only
the variables actually used in the block.
Can Opal do some kind of semantic analysis to help us out?
Original issue reported on code.google.com by [email protected]
on 10 May 2014 at 5:09
What steps will reproduce the problem?
pressing reset int.
What is the expected output? What do you see instead?
There is an error, it should reset the program
Original issue reported on code.google.com by [email protected]
on 1 Oct 2014 at 7:45
What steps will reproduce the problem?
Code:
(machine stopwatch
(var seconds := [0])
(state tick)
(state tock (onexit [seconds := seconds + 1]))
(ontime 500 tick -> tock t-tito)
(ontime 500 tock -> tick t-toti)
)
(spawn stopwatch tick)
Define tock before you define the var seconds, then add the var def. The block
still fails.
What is the expected output? What do you see instead?
It should work but it does not because when the block was compiled the
dictionary of values in scope was different. With use of slots instvars this
should be fixeable as the class of the block will be automagically recompiled.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 5 Nov 2014 at 9:58
What steps will reproduce the problem?
Code:
(var count := [0])
(machine counter
(state wait)
(state for)
(state it
(onentry [count value: count value + 1]))
(eps wait -> for wf)
(eps for -> it plus)
(eps it ->wait iw)
)
(spawn counter wait)
Set the count var to 0 at some point
What is the expected output? What do you see instead?
Count should start incrementing. It stays at 0
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:15
What steps will reproduce the problem?
Code:
(var foo := [1])
(machine m)
Change the value of foo in the variables list (e.g. set it to 2), then put a
space behind the m (or another consistent edit op). The var is reset to 1
What is the expected output? What do you see instead?
The var should keep the changed value.
This is not crucial, because it's a strange use. I am reporting it here so we
don't forget about it.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 10 Sep 2014 at 9:05
Right now errors are mostly ignored. The UI should however show a list of
current errors of the given machine, so if something goes wrong the list of
current errors gives clues.
This bugreport serves as a collection of the kinds of errors that should be
shown.
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 4:25
What steps will reproduce the problem?
Code:
(machine t
(state init)
(state foo)
(on resetting *-> init reset)
)
(spawn t init)
What is the expected output? What do you see instead?
There should be no error, instead there is an SubscriptOutOfBounds 1 in
LRPMachine>>event:
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:12
What steps will reproduce the problem?
Code:
(var minute := [0])
(machine timer
(state zero)
(state ten)
(state twenty)
(state thirty)
(state fourty)
(state fifty
(onexit [minute value: minute value + 1]))
(ontime 10 zero -> ten toten)
(ontime 10 ten -> twenty totwenty)
(ontime 10 twenty -> thirty tothirty)
(ontime 10 thirty -> fourty tofourty)
(ontime 10 fourty -> fifty tofifty)
(ontime 10 fifty -> zero tozero)
(state init
(onentry [minute value: 0.
doreset value: 0]))
(on resetting *-> init reset)
(eps init -> zero go)
(var doreset := [0])
(event resetting [doreset value: 1])
)
(spawn timer zero)
have the intepreter running
What is the expected output? What do you see instead?
Error message pops up
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:25
No longer sure this is needed in the UI, but a configuration option for this
would be good to have.
Original issue reported on code.google.com by [email protected]
on 12 Jun 2014 at 8:17
What steps will reproduce the problem?
Code:
(machine blah
(state foo
(machine inner
(state bleh)
)
(onentry (spawn inner bleh))
)
(state bar)
(ontime 5000 foo -> bar t1)
(ontime 500 bar -> foo t2)
)
(spawn blah foo)
visualize the 'inner' machine.
What is the expected output? What do you see instead?
The bleh state is never painted black. There is a bug in Roassal, put a self
halt in LRPProgramVisualization>>highlightNode: and step through it to see it
being colored.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 25 Aug 2014 at 8:33
- The LRPStyler hierarchy should be collapsed.
- The parser holds a reference to the styler class which makes the parser
package dependent on the ui package. This should be removed
Original issue reported on code.google.com by [email protected]
on 21 Jan 2015 at 9:33
What steps will reproduce the problem?
In the UI, when we change the from/to state of a transition, without changing
the name, the changes of the transition does not be seen in the UI.
What is the expected output? What do you see instead?
The transition should change the from/to state when it changes in the code
Please use labels and text to provide additional information.
I have not make the code to receive the transitions that changed. I'm going to
provide that code before this issue can be resolved
Original issue reported on code.google.com by [email protected]
on 21 Jul 2014 at 11:41
Some more controlability of the developer over the state of the FSM: set the
FSM to a given state to test a particular situation, e.g. by clicking on a
given state. + do we do this with clean state leaving or not.
Original issue reported on code.google.com by [email protected]
on 18 Aug 2014 at 7:27
Remove the close button from the errors window and autoclose it when the
interpreter window is closed.
Actually there should be a registration mechanism so that clients (e.g. bridge
implementations) can be notified whenever the interpreter is closed.
Original issue reported on code.google.com by [email protected]
on 23 Jan 2015 at 9:16
What steps will reproduce the problem?
Press a +X button. It always appends to the text
What is the expected output? What do you see instead?
It should insert at the place of the cursor.
Alex sais that the cursor offset can be gotten by asking the morphic widget for
the selection. If it is an interval of 1 then it is the cursor.
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:27
What steps will reproduce the problem?
Code:
(machine m
(state p)
(eps p -> q pq)
)
then select the complete line of the transition and hit delete
What is the expected output? What do you see instead?
RubCurrentLineBarDecorator(Object)>>doesNotUnderstand: #replaceFrom:to:with:
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 4 Sep 2014 at 3:09
What steps will reproduce the problem?
(state bar)
(state foo)
(eps bar -> foo t-1)
delete that transition and "t-1" will be still in the UI
What is the expected output? What do you see instead?
When a transition is deleted, the name of the transition is still in the
visualization.
The name should be deleted too
Original issue reported on code.google.com by [email protected]
on 1 Oct 2014 at 7:32
What steps will reproduce the problem?
Code from issue #9 (with fix LiveRobotics-UI-johanfabry.24 from issue #13 in)
What is the expected output? What do you see instead?
Error: Instances of GrowlMorph are not indexable. The error is in the ifError:
block at the end of LRPInterpreter>>interpretBlock: aBlock withScope: aScope. I
think it should be [GrowlMorph openWithLabel: 'LRP Error' contents: 'Fail at
evaluate block' color: Color yellow. ^false].
Please check and fix, and have a look at the other ifError: cases to see if
something similar is needed.
Original issue reported on code.google.com by [email protected]
on 19 May 2014 at 12:00
Clicking on an element in the visualization should highlight the corresponding
element in the code.
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 1:29
What steps will reproduce the problem?
Code:
(var v := [123])
(machine m
(state s)(state t)
(ontime x s -> t st)
)
What is the expected output? What do you see instead?
A debugger pops up. There should be a normal error message instead.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 19 Jun 2014 at 5:59
What steps will reproduce the problem?
(machine m
(state foo (onexit [Transcript show: '-']))
(state bar (onentry [Transcript show: '+']))
)
(spawn m foo)
Transition or teleport to bar via the menu item.
What is the expected output? What do you see instead?
The hightlight should change to bar but it does not.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 2 Feb 2015 at 10:55
In LRPInterpreter>>interpretBlock:withScope: the block is always compiled
before it is executed (in the last line). This is highly inefficent.
Instead memoization should be used so that the first time this block is
interpreted, is it compiled and the result of that (LRPParser new
createSTBlockFrom: aBlock withVariables: dict) is kept.
Note that it would also be cleaner if the createSTBlockFrom: withVariables:
implementation is in aBlock, so that you don't need to instantiate the parser
for nothing.
Original issue reported on code.google.com by [email protected]
on 7 Jan 2015 at 5:26
It would be nice to have a button in the UI that starts/stops the layout
animation. + have an automatic stopping of the animation after a timeout (e.g.
5 seconds) after each add/remove change in the vis.
See:
RTSpringLayoutStepping>>addStartStopButton
view canvas addMenu: 'Start/Stop' callback: [
(view canvas hasAnimation: self)
ifTrue: [ view canvas removeAnimation: self ]
ifFalse: [ view canvas addAnimation: self ]
]
Original issue reported on code.google.com by [email protected]
on 2 Oct 2014 at 2:58
Common use case according to Pablo: an event is triggered but the programmer
has no clue why
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 1:30
What steps will reproduce the problem?
Code:
(machine m
(state a)
(state b)
(eps a->b ab)
)
What is the expected output? What do you see instead?
The transition should parse correctly.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 3 Oct 2014 at 6:36
What steps will reproduce the problem?
Code:
(var count := [1])
(machine m
(state o)
(state t (onentry [count value: count value +1]))
(eps o -> t ot)
(eps t -> o to)
)
(spawn m o)
Delete the code, then add
(machine p)
What is the expected output? What do you see instead?
MNU + an error saying machine m is not found. Note that if the interpreter is
paused before deleting and adding, the error appears when the interpreter is
unpaused.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 21 Aug 2014 at 4:39
What steps will reproduce the problem?
(machine blah
(state foo
(machine inner
(state bleh)
)
(onentry (spawn inner bleh))
)
(state bar)
(ontime 5000 foo -> bar t1)
(ontime 500 bar -> foo t2)
)
(spawn blah foo)
If you go to the "inner" machine in the UI and wait until the bleh state to be
active, then you change the machine to the outer one ("blah") you can see how
the "bleh" state appears together with the state of the "blah" machine
What is the expected output? What do you see instead?
The inner state should not appear
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 25 Aug 2014 at 11:16
What steps will reproduce the problem?
(var v := ['asdf'])
(machine m
(state s)(state t)
(ontime v s -> t st)
(eps t -> s ts)
)
(spawn m s)
What is the expected output? What do you see instead?
A debugger window pops up. A normal error should be shown.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 19 Jun 2014 at 6:01
What steps will reproduce the problem?
Code:
(machine m
(state p)
(eps p -> q pq)
)
Remove the transition.
What is the expected output? What do you see instead?
DNU in LRPProgramVisualization>>updateTransitionsOf: The code should check if a
transition is nil before trying to remove it (ifNotNilDo: ?). Also think about
other possible cases in that method.
I'm waiting on issue #33 to be resolved to fix this.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 4 Sep 2014 at 3:21
Now if only we were smart enough to understand it ...
Original issue reported on code.google.com by [email protected]
on 3 Oct 2014 at 6:37
Need the variables to behave as normal variables, not valueholders. To do this:
Traverse the block and find references to variables, also as LHS in
assignments. Change these to value and value: message sends.
Original issue reported on code.google.com by [email protected]
on 10 May 2014 at 5:12
We need a button that has the visualization show the most deeply nested machine
that has the active state. When this option is on, the visu should dive in and
out of nested machines when needed.
Original issue reported on code.google.com by [email protected]
on 22 Jan 2015 at 8:27
What steps will reproduce the problem?
Code:
(machine m
(state s) (eps s -> t st))
(spawn machine s)
Close the interpreter
What is the expected output? What do you see instead?
No more error messages should be produced, it seems this is not the case. Ergo
the interpreter is still running.
Please use labels and text to provide additional information.
Original issue reported on code.google.com by [email protected]
on 30 Jun 2014 at 6:45
It would be nice to have state and transition de-highlighting fade over time so
we have a visual record of transitions, especially if they go fast.
Original issue reported on code.google.com by [email protected]
on 12 Jun 2014 at 3:26
Check statically for errors when is possible.
Look the issue #9 and check for static errors and check everyone that need to
be checked:
- Transition miss event and/or states
- Spawn miss machine and/or state
Original issue reported on code.google.com by [email protected]
on 18 May 2014 at 11:15
Need to investigate to clarify when active state is not highlighted when a
machine vis is switched
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:22
For this program:
(var count := [1])
(machine blah
(state init
(onentry [count := count + 1])
)
(state nested
(machine foo
(state nInit
(onentry [count := count + 1])
)
)
(spawn foo nInit)
)
(eps init -> nested t1)
)
The variables on the variable viewer should be:
count = 2 for blah
count = 3 for nested
But for both, count is 3
Original issue reported on code.google.com by [email protected]
on 23 Jan 2015 at 2:24
What steps will reproduce the problem?
Code:
same as issue #9
What is the expected output? What do you see instead?
See LRPUI>>highlightState:
Original issue reported on code.google.com by [email protected]
on 18 May 2014 at 11:51
What steps will reproduce the problem?
Code:
(var leftmotor := [motor1])
(var rightmotor := [motor2])
(var bumper := [sensor1])
(var light := [sensor2] )
;need to map ST code sending messages to more PhaROS type style of code
; calibration ''constants''
(var maxlook := [100])
(var lightthresh := [128])
(var backdist := [10])
(var turndist := [100])
; a state machine with name follower
; see below how to kick it into action
(machine follower
(state moving
; what to do when entering the state. always completely executed
; [] is a Smalltalk Block
(onentry [leftmotor forward . rightmotor forward])
; what to do when leaving the state. always completely executed
(onexit [leftmotor stop . rightmotor stop])
)
;a transition triggered by outofline event
; from moving state to looking state
; we call it tlooking
(on outofline moving -> looking tlooking)
(on intheline looking -> moving tmoving)
;events happen whenever their condition evaluates to true
(event outofline [light read > lightthresh + 10])
(event intheline [light read < lightthresh - 10])
(state looking
(machine lookalgo
(var time := [maxlook value])
;timeout transitions
(ontime time lookleft -> returnleft t-returnleft)
(ontime time lookright -> returnright t-returnright)
(ontime time returnleft -> lookright t-lookright)
(ontime time returnright -> lookleft t-lookleft)
(state lookleft (onentry [rightmotor forward]))
(state returnleft
(onentry [rightmotor back])
(onexit [rightmotor stop]))
(state lookright (onentry [leftmotor forward]))
(state returnright
(onentry [leftmotor back])
(onexit [leftmotor stop . time := time * 2 ]))
)
;spawn the lookalgo machine, start in the lookleft state
(onentry (spawn lookalgo lookleft))
(onexit [leftmotor stop . rightmotor stop])
))
What is the expected output? What do you see instead?
Variable list is in random order. It should be in the order of variables in
scope. The interpreter should give them in the right order (or reversed, as the
UI already reverses that)
Original issue reported on code.google.com by [email protected]
on 12 May 2014 at 5:02
1) Have a decent size when opening
2) Better distribute the widgets in the window
Original issue reported on code.google.com by [email protected]
on 9 May 2014 at 2:25
When you click on a variable, its value is shown in the input box to be able to
change it.
It would be nice to set it when you hit Enter on that input box as an
alternative way to click on "Set" button.
Btw, I am not asking for replacing the Set button.
Original issue reported on code.google.com by [email protected]
on 10 Sep 2014 at 9:05
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.