Code Monkey home page Code Monkey logo

coffeemud's People

Contributors

bozimmerman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

coffeemud's Issues

Typo: ArchonGuide.html

Text:
Actual: CREATE
Depending on the argument, this command can bring almost anything into existence, from rooms to doors, from monsters to items. The create command is discussed at length in the sections on building rooms and areas. It is also featured prominantly in theGame Builders Guide.

Expected:
CREATE
Depending on the argument, this command can bring almost anything into existence, from rooms to doors, from monsters to items. The create command is discussed at length in the sections on building rooms and areas. It is also featured prominently in the Game Builders Guide.

Errors:
prominantly > prominently
missing space before game builders guide link

Localhost only?

For some reason I can only connect to my mud through localhost. I can't even connect through the local network. It is the same for telnet as well as both web servers.

Siplet > MXP > tags not closing correctly

  1. Clean install CM onto ubuntu
  2. Using Siplet, login as user with MXP enabled (client machine: Safari, macOS Catalina (final build before Big Sur 14.0)
  3. Perform any command that gives guaranteed output (score)
  4. Click any stat - eg WIS

Result:
tags are sent to Siplet text input box

Note: appears to occur on any MXP-enabled value, not just score>wis. EG Doors, goto, score...

Empty newline missing in "qualify" between character classes and expertises

`General Skills:
[Lvl] Name Requires [Lvl] Name Requires
[1 ] Bandaging 1 train [1 ] Swim 1 train
[2 ] Armor Tweaking 1 train [2 ] Kick 1 train
[3 ] Two Weapon Fighting 1 train [4 ] Weapon Sharpening 1 train
[4 ] Shield Bash 1 train [5 ] Cleave 1 train

Common Skills:
[Lvl] Name Requires [Lvl] Name Requires
[1 ] Gem Digging 1 train [1 ] Drilling 1 train
[1 ] Fishing 1 train [1 ] Floristry 1 train
[1 ] Foraging 1 train [1 ] Herbology 1 train
[1 ] Hunting 1 train [1 ] Play Instrument 1 train
[1 ] Shearing 1 train [1 ] Smoke Rings 1 train
[2 ] Butchering 1 train [2 ] Cooking 1 train
[2 ] Dyeing 1 train [2 ] Embroidering 1 train
[2 ] Engraving 1 train [2 ] Lacquering 1 train
[3 ] Blacksmithing 1 train [3 ] Carpentry 1 train
[3 ] Leather Working 1 train [3 ] Tailoring 1 train
[4 ] Costuming 1 train [4 ] Distilling 1 train
[4 ] Mining 1 train [4 ] Pottery 1 train
[4 ] Sculpting 1 train [4 ] Searching 1 train
[4 ] Tanning 1 train [4 ] Weaving 1 train
[5 ] Armorsmithing 1 train [5 ] Baking 1 train
[5 ] Cobbling 1 train [5 ] Fletching 1 train
[5 ] Food Prep 1 train [5 ] Glass Blowing 1 train
[5 ] Painting 1 train [5 ] Paper Making 1 train
[5 ] Scrimshawing 1 train [5 ] Weaponsmithing 1 train

Languages:
[Lvl] Name Requires [Lvl] Name Requires
[1 ] Draconic 3 practices [1 ] Drowish 3 practices
[1 ] Dwarven 3 practices [1 ] Elvish 3 practices
[1 ] Fey 3 practices [1 ] Gigantic 3 practices
[1 ] Gnomish 3 practices [1 ] Goblinese 3 practices
[1 ] Ignan 3 practices [1 ] Orcish 3 practices
[1 ] Sign Language 3 practices [1 ] Undercommon 3 practices

Character Classes:
[Lvl] Name Requires [Lvl] Name Requires
[1 ] Barbarian 1 train [1 ] Paladin 1 train
[1 ] Ranger 1 train
Expertises:
Name Requires Name Requires
Quick Working I 1 train Combat Fluidity I 1 train
Reduced Conjuring I 1 train
`

Clan suggestions 1

Here is my first wave of suggestions for clans
1)Allow members to be assigned to multiple positions and add clanunassign command.
2)Make the clanqual command use its own power and respect voting. Give that power to all positions that can already do it.
3)Change clanwho from power CLAN_BENEFITS to power LIST_MEMBERS.
4)Add SET_MORGUE power for clanmorgue command instead of SET_HOME.
5)Add a clanprobation command to block a clan member from using the clan's channel or journal untell it expires or is removed. Add a power for it and make it only work on those with a lower rank than you.
6)Allow members with ORDER_CONQUERED to be above the law in conquered areas if that is not already the case.
7)Add LAW power for changing the law in conquered areas instead of ORDER_CONQUERED.
8)Add clan dues that can be set by leaders as a money tax taken from each member into the clan bank. Add commands to set the dues, view your dues, see who owes, and forgive dues. Add powers for setting, viewing the owed list, forgiving, and being exempt. List, forgive, and exempt could probably be the same power. (SET_DUES and FORGIVE_DUES perhaps?)
9)Add clansumon and clanteleport skills usable by enchanters to teleport to and summon clan members.

Feel free to tackle these in any order. Constructive feedback is always appreciated. Thank you.

Limit skill use in area/location

I would like to be able to limit skill use by location, for example mining - it makes no sense, nor would it be appropriate to mine for ore in the sky, or in the middle of a building. I would like to be able to disable skills - the closest thing I have been able to find is ResourceOverride for a behaviour which can only be applied to locations and not areas.

Nice-to-have: word swap in account mananger

Please consider changing "E)mail change" to "C)hange email"

Email change -> reminiscent of sending myself a copy of the results of my account changes (adding character, changing pw, changing email - as a result of "write down your new account name and password")
Change email -> change the registered email on my account

Screen Shot 2020-07-06 at 4 10 16 pm

This screenshot also says email is supported - at the time of writing SMTP had been disabled in coffeemud.ini so it's a little unexpected

Expanded NPC Dialogue?

I want to create more dynamic conversations with the NPCs in my MUD, but currently the system is sort of limited. You need to use the dialogue file and reload the mud each time you want to update it.

I'd like to have complex conversations with multiple keywords, which I could dynamically adjust as time goes on. It seems that the quest engine may be the best way to do this, but in general that is a lot more work then it should be.

Is there chance of having a more stream lined / complex / easier to use dialogue engine being introduced?

Add SSHD server for improved security

Currently, telnet is one of the access options for communicating with the server. Telnet is inherently insecure as all the data is transmitted in plain text.

One possible solution to this issue would be to add support for SSHD, server side, through the use of third party projects such as Apache Mina/SSHD. This would provide not only encrypted communications over a widely accepted, firmly entrenched standard, but it would also provide an interesting layer of security for users - such as the ability to use a shared key for logins as opposed to a password.

Postgresql database create script is missing a semicolon

Line 306 is missing a semicolon,
Currently reads:
ALTER TABLE CMBKLG
ADD PRIMARY KEY (CMNAME,CMINDX) -- semicolon to terminate the line
This means that alter table on CMBKLG doesn't work, and the CREATE TABLE for CMCLIT also fails, as postgres doesn't see the end of the commit.

Adding a semicolon to the end of line 306 fixes the problem.
ALTER TABLE CMBKLG
ADD PRIMARY KEY (CMNAME,CMINDX) ; -- semicolon terminating the line.;

Nice-to-have: Improved workflow for setting up new server

If you run through the initial setup script InstallUnix.sh, you're not asked for the most holy of information.

I assumed passwords are hashed by default. However; poking at the fakedb containing player data shows this is not so. Converting the password fields from text to hashed still leaves plaintext in place after conversion. In my mind, this is more important than requiring a name for the server. A randomly generated server ID of Coffeemud_bluecircleflyinghorse44 could be used as a placeholder until the owner gets their rhythm going.

There's a small chance the plaintext is left in place even after converting from player-file logins to account-menu logins. I've forgotten much of the terminology, so if its not clear just say so and I'll try harder.

Player Access Character Portrait Issue

If user has more than one character, picture uploads to the first character despite selected player.

(i will try to help with some of these issues i post, they are mostly cosmetic anyway)

chitch

After "git pull" MUD locks up creating accounts

I just did a pull from the repo and when a new user tries and create a account it just hangs for them and spits out a warning on the sever console. Any ideas or do I need to provide more info?

Probleme running mud

Hi there, i've trying to install the mud to run it and to build my own server. I've modified the path in mud.bat and make.bat to point to Java app on windows and when i execute the mud.bat, nothing happens

Malformed URL for siplet PlaySound if both MXP and MSP are enabled

If BOTH MXP and MSP are enabled in a session the URL passed to the PlaySound function in termsupport.js is stripping out the forward slashes (apart from the last one) i.e. instead of http://mydomain:27744/sounds/ the url is http:mydomain:27744sounds/

So a fetch of "clap.wav" becomes http:mydomain:27744sounds/clap.wav which returns a 404 ( because the prefix is obviously malformed) and the sound is not played.

IF ONLY MSP is enabled and MXP is NOT enabled the URL passed to the PlaySound is correct (forward slashes are not stripped)
and the sound is played i.e. http//:mydomain:27744/sounds/clap.wav

I have verified issue with server and client running on same computer and on separate computers. I have tried replacing mydomain by ip address. I have tried with the 5.10.0.2 and also latest commit from github - all have same issue.

I could not quite debug exactly where the problem was else I would have offered a solution not just a problem !

DOMAIN=mydomain
SOUNDPATH=http://mydomain:27744/sounds/
MXPIMAGEPATH=http://mydomain:27744/images/mxp

Server: Coffemud 5.10.0.2, Windows 10, JDK 1.6.0_45, MySQL (community) 5.7.39
Client: Chrome 108.0.5359.72 (64 bit) Windows 10

[Question] How to make mob death survive server restart

Thanks a lot for this amazing MUD server, the amount of work you put in it is mind-boggling.

I'm trying to have some mobs, like arch villains players should really have to slay only once and for all, stay dead when they die. Setting their rejuv to 0 helps but when I take the server down for maintenance and restart it, these mobs reinsert.

Is it possible to make their death permanent?

If not I was thinking of using scripting to send them to a limbo room when they die but I'm afraid they will reinsert at their original spawn point on server restart.

Any suggestion welcome ๐Ÿ˜Š

Stored XSS in forum possible

Hy,
I found a stored cross site scripting vulnerability in the forum. One can simply drop javascript code as a comment. On quoting the message the code gets executed. The proof of concept can be found on http://www.coffeemud.net/forum.cmvp in general discussion in the discussion named "test".
A simple fix would be to filter user input before storing using specialized filter functions.

Best regards

no available authentication scheme

OK I've been going back and forth on whether to do an issue for this, but given that my cert seems to work under other servers, I feel like this is at least a documentation issue.

So what kind of format exactly does the keystore need to be in? I tried a million different ways to set it up right... I cat'd the private key to the chain bundle, openssld it to x509, created a jks keystore with the key... The guy at the SSL support said for java it should be in a jks keystore, but not as x509, as pfx. I tried doing it with the fullchain pem, I tried so many things..... There are so many conflicting instructions out there....

What are the ACTUAL, step-by-step instructions to follow, to get the bloody SSL cert working under this thing? Or at least a detailed explanation of a final format that will WORK? Please?

I read something about DER not working with SSLv3, so I tried new private keys that were RSA, and I tried changing the context call from SSLv3 to a couple other things.... I've been at this for almost a week now, and I don't feel like I can start the bloody thing without SSL because I don't want it to be hacked the minute it goes up.

I guess I can do a whole PHP thing for the macros/DL support, or else rip it from the codebase, but now I'm starting to be more a web developer than a mud developer. :/

Enhancement: Please add placeholder text in required fields

  1. Clean install CM
  2. Using an archon, load Holidays in the grinder
  3. Click link "Create new" (do not fill the text field)

Result: Nothing appears to occur. It takes a few moments for the realisation you need to fill the text field occurs. Dummy text would be highly useful - eg "Dummy Holiday".

Incomplete UTF-8 support

Fakedb does not handle UTF-8 correctly. Switching to a different database gets around the issue.

Siplet assumes iso-8859-1 input.

Grinder does not support UTF-8 well. UTF-8 text is not displayed correctly.

UI - Allocating 2,000,000,000 experience to a clan/guild displays incorrect value

  1. Set up a new clan and set it to active
  2. Give 2000000000 experience
  3. Use the CLAN skill

Result:
Level :126 (Next at 2.000439E9xp)

Note:
If there is an upper limit to how much exp a clan can earn, it isn't visible in grinder or via command clantax. If the clan somehow gets more exp while needing an amount like 2.000439E9xp (eg via grinder), the clan may level back down to level 1. If a player has HP benefit from the clan and is already hurt low enough, its theoretically possible to kill that player just from this clan de-level.

Hamurabi support

I know we have the ability to allow players to have ownership over areas. But what if we allowed players to have ownership over outdoor areas...

...And allow them to create their own kingdoms?

This stems from a very old BASIC computer game called Hamurabi.

https://en.wikipedia.org/wiki/Hamurabi

It was a very simple management program based on population, land area, crop yield and managing grain distribution.

I'm just thinking say once a game month have player's kingdom updated with changes, births and deaths, crop yield, etc. Nothing like an actual kingdom, just a numbers management section of the game.

GenMap error

Hi there,

I've been trying to create a GenMap for a small area, but after the map is created, trying to read it creates an "Oops!" response. I copied the output on the log for your opinion on the matter:

java.lang.NullPointerException
at com.planet_ink.coffee_mud.Items.Basic.StdMap.executeMsg(StdMap.java:588)
at com.planet_ink.coffee_mud.Locales.StdRoom$1.apply(StdRoom.java:874)
at com.planet_ink.coffee_mud.Locales.StdRoom$1.apply(StdRoom.java:870)
at com.planet_ink.coffee_mud.Locales.StdRoom.eachItem(StdRoom.java:2175)
at com.planet_ink.coffee_mud.Locales.StdRoom.executeMsg(StdRoom.java:870)
at com.planet_ink.coffee_mud.Locales.StdRoom.reallyReallySend(StdRoom.java:1546)
at com.planet_ink.coffee_mud.Locales.StdRoom.reallySend(StdRoom.java:1552)
at com.planet_ink.coffee_mud.Locales.StdRoom.send(StdRoom.java:1581)
at com.planet_ink.coffee_mud.Commands.Read.read(Read.java:69)
at com.planet_ink.coffee_mud.Commands.Read.execute(Read.java:106)
at com.planet_ink.coffee_mud.MOBS.StdMOB.doCommand(StdMOB.java:1968)
at com.planet_ink.coffee_mud.MOBS.StdMOB.dequeCommand(StdMOB.java:1893)
at com.planet_ink.coffee_mud.MOBS.StdMOB.enqueCommand(StdMOB.java:2082)
at com.planet_ink.coffee_mud.Common.DefaultSession.mainLoop(DefaultSession.java:2518)
at com.planet_ink.coffee_mud.Common.DefaultSession.run(DefaultSession.java:2236)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Thank you so much for your time!

Regards,
XM

5.9.8.1 (fresh install, not upgrade) seems to have issues creating new characters

Haven't upgraded for a while so decided to move my working install aside and start fresh. Mud built (though with complaints about the mozilla js packages in the doc building phase) and started up fine, but when I went to telnet in to create my archon, I got the following:
Name: z3ndrag0n

'Z3ndrag0n' is not recognized.
That name is also not available for new players.

(And it didn't seem to matter what name I chose.)

In the end, I hit "*" and it successfully created my initial character, but wondering if there's been a mistake here that most people are missing because upgrades versus fresh installs?

Converting Abilities to GenAbility

So I know that this has been answered before, but it seems like since the release of CoffeeMUD 5.8 (or was it 5.9?) I have been unable to convert StdAbility's to genAbility's. When I modify, for instance, the ability 'Spell_Planeshift', it claims it's a generic ability. Running:
create ability Spell_Planeshift
I get a blank ability template as if the ability Spell_Planeshift had entirely been forgotten. When I tried it in the MUDGrinder earlier, it told me I had to convert it first. When I did that, it gave me a 500 internal server error, and the ability conversion was aborted. So I'm wondering how I would go about this now? Because it seems that, now, the only things that can be converted into generics are races and classes.

Recall issue

Just curious how recall works. I changed in the coffeemud.ini the new player start, death and morgue, but when i recall it takes me to a 3000 off ID room. Is recall hardcoded in, or is it set in the player file? The default New Area is gone, imported the area.cmare you provided, no i could see an issue if it lies in myplayer having a location that doesn't exist..

Thx,
Joe

Nice to have: Alert user(s) when updating possessed mobile

  1. Go to any mobile in-world with Account1
  2. Possess mobile using Account1. Do not leave mobile
  3. Load MudGrinder with Account2
  4. Sign in to MG and load the area > mobile in MG using Account2
  5. Modify the mobile in any context you want using Account2
  6. Observe Account1 returned back to regular body without any kind of alert
  7. Observe Account2 is not warned of Account1's presence

This also occurs if Account1 is modifying the mobile/item via in-game MODIFY command

Background:
Son and I were trying to untangle a thing he didn't know - he via grinder, me via telnet. We kept over-writing each other's modifications and getting very confused on why changes weren't sticking.

Note:
Ignore child's lack of knowledge, thats nothing to be concerned about... yet...

Informational - Banned players/accounts are severely under-informed

  1. Setup an account with multiple characters
  2. Ban account
  3. Login to the mud via telnet, siplet, :27744 (access.cmvp, forums.cmvp)
  4. Generate a forgotten password reset

Result:
CMVP merely doesnt allow banned user to login or explain banned, siplet simply disconnects the user, password reset presents password as cleartext but does not mention bannination (cleartext password is likely a different issue). The only time a banned account is explicitly told "you're unwelcome" is via telnet workflow.

'generate string list' returns error

Greets:

Per 'ahelp generate' you are supposed to be able to output a list of all 'id' attributes.

This command actually outputs the error "The STRING id 'LIST' has not been defined in the data file." followed by what I assume is the list.

Do also note that per the changes list -> version 5.8.1 -> 26, there are supposed to be 'themes' such as "town, orcs, trolls, and goblins". Per the 'id' output as well as the 'ahelp generate' output, there is no mention of the use of these 'themes' as part of the command.

Potential (client-dependant) MXP sound string issue?

Hello!

I have commented out MXP images and sounds. However, actions that would normally play a sound still show text as if it were partially trying to send a sound command.

For example, when I use a roar social, it shows:
ROOOOOAAAARRRR!!!! <SOUND roar.wav V=50 P=34

Laughing results in:
You laugh. <SOUND laugh.wav V=50 P=19

I say partially because it is indeed cut off like that within the game. For reference, I use Mudlet 3.0.0-delta. In MUSHclient, this does not happen. In the console, Mudlet is detected as "UNKNOWN MXP MSDP GMCP CMP ANSI", whereas MUSHclient is detected as "MXP CMP ANSI." Any ideas?

GMCP - Malformed JSON strings

Using Mudlet 3.9.0 as client and this package for GMCP stuff.

Error:

 <Lua error:InvalidJSONInput: parse error: invalid object key (must be a string)
          08553,"name":"a ration pack",}{"id":1628722269,"name":"a wat
                   (right here) ------^
 at ..\3rdparty\lua_yajl\lua_yajl.c line 345>

Digging around the scripts from the package show no sign of doing anything but parsing whatever data it's given from the server, so I'm left thinking that a bit of code somewhere is adding in a comma where it shouldn't be; The toString functions for the MiniJSON.java classes under both core and siplet.support are really the only places I can find where this would happen, specifically

for(final Iterator<String> k = keySet().iterator(); k.hasNext();)
			{
				final String keyVar = k.next();
				value.append("\"").append(toJSONString(keyVar)).append("\":");
				final Object obj = get(keyVar);
				appendJSONValue(value, obj);
				if(k.hasNext())
				{
					value.append(",");
				}
			}
			value.append("}");

I feel like k.hasNext() is causing it to toss another comma in there before the closing brace, but I'm not sure as to why

I guess I'll be poking at it until it either turns out my hunch is wrong (or is not the lib's fault) or someone beats me to the solution

[BUG] in RTree.java

I am aware that this part of the source code is currently under-utilized, but I am pretty sure the code is question will never work as written.

private RTreeNode chooseLeaf(final T o, final RTreeNode n) {
	assert (n != null);
	if (n.isLeaf()) {
		return n;
	}
	else {
		final BoundedObject.BoundedCube box = o.getBounds();

		int       maxOverlap = Integer.MAX_VALUE;
		RTreeNode maxnode    = null;
		for (int i = 0; i < n.children.size(); i++) {
			final int overlap = expansionNeeded(n.children.get(i).box, box);
			if ((overlap < maxOverlap) || (overlap == maxOverlap) && ((maxnode != null) && (area(n.children.get(i).box) < area(maxnode.box)))) {
				maxOverlap = overlap;
				maxnode = n.children.get(i);
			}
		}

		if (maxnode == null) // Not sure how this could occur
		{
			return null;
		}

		return chooseLeaf(o, maxnode);
	}
}

the comment on the if statement checking maxnode says this should never happen but in reality, maxnode will always be null.

When maxnode is initialized, it is set to null, and then in the for loop it can only be set to a value if maxnode is not null, and maxnode will never be non-null according to the code as written.

Unfortunately I am not familiar enough with the code to be able to figure out what should really be checked to be able to set maxnode to a non-null value, so I figured that I would open an issue so that the code could be reviewed.

Typo - control.cmvp > Player Settings > StartStat

Actual:
If this is -1 the system will start all player stats at BASEMINSTAT
and allow the player to spent MAXSTATS - 18 points in any
way they like, though no stat can be spent above BASEMAXSTAT.
Default is 0.

Expected:
If this is -1 the system will start all player stats at BASEMINSTAT
and allow the player to spend MAXSTATS - 18 points in any
way they like, though no stat can be spent above BASEMAXSTAT.
Default is 0.

Change -> spent/spend

Wish for practices and trains.

Be able to wish for practices and trains with the wish spell.
Also remove con point from gender, height, and weight change.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.