Giter Club home page Giter Club logo

legup's Introduction



GPL 3.0 License Discord
A tool to teach formal logic using puzzles


LEGUP (Logic Engine for Grid-Using Puzzles) is a better way to learn formal logic. It was created by Dr. Bram van Heuveln, whose goal for this project is to provide a better interface for students to learn the basic principles of logical reasoning.

Note: A web version of LEGUP (Bram-Hub/LegupWeb) was previously under development, but it has been halted due to no one actively working on the project. Contributions to both versions of LEGUP are greatly appreciated. If you are interested in using LEGUP for educational purposes, please use this app version.

Table of Contents

Background

Dr. van Heuveln has taught logic courses on a frequent basis for the past 15 years, and noted that a good number of students struggle with the systems of modern formal logic that were developed in the late 1800's and early 1900's, and that have been universally used in logic courses since. These traditional systems use abstract linear symbol strings such as (P & Q) -> (R v S), and deploy even more abstract rules such as & Elim to infer new symbol strings from old ones, thus engaging the user in logical reasoning.

This project brings about the idea that there are more pedagogically effective ways for students to learn the basic and important principles of logical reasoning.

LEGUP uses a more visual representation in a more concrete and engaging environment. These and other features of the LEGUP interface are suspected to have several advantages over more traditional interfaces in terms of learning logic.

Use Cases

The LEGUP interface allows the user to solve different types of grid-based logical puzzles. Probably the best known example of such a puzzle is the popular Sudoku puzzle, but there are many other types of puzzles that are based on the principle of filling in cells of a square or rectangular grid with different kinds of objects. In all cases, the user is provided certain clues that will force a unique configuration of objects in the grid. These types of puzzles are often advertised as "logic puzzles," and are claimed to train one's logical mind as, using deduction, users should be able to infer which object goes where.

So, how does the LEGUP interface differ from online platforms for grid-based games? The most important difference is that the LEGUP interface requires the user to explicitly indicate their logical reasoning. Thus, solving the puzzle due to some lucky guesses is no longer an option! The interface will congratulate the user less on the fact that the user was able to solve the puzzle, but more on how the user solved the puzzle. This is essential to logic. Logic is not about the truth or the correct or best answer, but about deductive implication and valid inference. What follows from what, and why?

LEGUP also provides a single interface that is capable of supporting many different types of puzzles. Since most of the interface remains the same, however, users wil start to recognize certain similarities between the different puzzles. In particular, since they have to explicitly state their reasoning, users should start to see strong similarities in their logical reasoning patterns from puzzle to puzzle, is the very basis of the abstract logical reasoning principles taught in traditional logic courses. However, rather than being "thrown in the water" with abstract principles based on obscure symbols, users instead are dealing with a concrete, fun, and engaging logic puzzle. As such, LEGUP aims to give its users a "leg up" when it comes to the understanding of logic.

For Educators

If you are an educator interested in using LEGUP, go to the releases page to download the latest release of LEGUP. You can have your students download LEGUP from the same page. Some sample puzzle files can be found in the puzzle files folder.

For Students

If you are a student interested in learning the basics of logic, LEGUP is a great way for you to get started. If your instructor is using LEGUP in the classroom and you are looking for extra practice, you can reference the sample puzzle files can be found in the puzzle files folder to get more practice.

Additionally, if you are interested in computer science and programming, please consider contributing to LEGUP! Not only would it a great way to practice logical reasoning, but it is also a great way to dip your toes into open source software and contributing to open source projects.

Documentation

Documentation is actively being worked on on the LEGUP wiki.

The Javadocs for our application are currently hosted directly on our GitHub Pages site.

Documentation is very much in the early stages, and we would greatly appreciate anyone who is willing to help write and structure the documentation. Currently, the priority is to write detailed documentation on how Nurikabe works, as it is the puzzle that is the most developed within LEGUP.

Contributing

All contributions to LEGUP will be greatly appreciated. Currently, we need the most help in the following areas:

  • Documentation
  • Test suites

Please read our contribution guidelines for more detailed guidelines on how to contribute to LEGUP.

License

LEGUP is licensed under the GPL-3.0 license, which can be viewed here.

LEGUP: A Better Way to Learn Formal Logic
Copyright (C) 2022, the LEGUP Developers

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

The look and feel of LEGUP uses FlatLaf, which is licensed under the Apache-2.0 license.

Some of the icons used in LEGUP were taken from or derived from the icons found on https://fonts.google.com/icons, which is licensed under the Apache-2.0 license.

legup's People

Contributors

19690ao avatar acewvrs avatar alapocas avatar charlestian23 avatar charsong24 avatar chase-grajeda avatar cjreed121 avatar corppet avatar emiliobejasa avatar feifei-gh avatar gwinprogrammer avatar hazelcullom avatar hiimadd avatar jimmers2001 avatar jpoegs avatar kevin-771 avatar mattsweet417 avatar millibyte1 avatar nmiklu avatar pitbull51067 avatar relurk1 avatar rpifisherman avatar sarah-min avatar shankar-veludandi avatar sinhac avatar summerhenson avatar therason avatar thismatt avatar trevorbrunette avatar wei-jun7 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

Watchers

 avatar  avatar  avatar

legup's Issues

NullPointerException on launch

When launching the application, a NullPointerException is thrown as soon as the loading screen disappears and what I think is the main window launches.

Software version: 2.0
Java versions: 11.0.8, 14.0.2, and 8 (I don't know how to get a semver number for my Java 8 installation).
Operating System: Arch Linux

Command line output (generated from the 11.0.8 installation):

libpng warning: iCCP: known incorrect sRGB profile
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
2020-10-05 17:39:12,071 main ERROR Unable to locate appender "fileLogger" for logger config "root"
[DEBUG] 2020-10-05 17:39:12.349 [main] Config - [puzzles: null]
[DEBUG] 2020-10-05 17:39:12.353 [main] Config - Class Name: edu.rpi.legup.puzzle.battleship.BattleShip
[DEBUG] 2020-10-05 17:39:12.353 [main] Config - Class Name: edu.rpi.legup.puzzle.fillapix.Fillapix
[DEBUG] 2020-10-05 17:39:12.354 [main] Config - Class Name: edu.rpi.legup.puzzle.heyawake.Heyawake
[DEBUG] 2020-10-05 17:39:12.354 [main] Config - Class Name: edu.rpi.legup.puzzle.lightup.LightUp
[DEBUG] 2020-10-05 17:39:12.354 [main] Config - Class Name: edu.rpi.legup.puzzle.masyu.Masyu
[DEBUG] 2020-10-05 17:39:12.354 [main] Config - Class Name: edu.rpi.legup.puzzle.nurikabe.Nurikabe
[DEBUG] 2020-10-05 17:39:12.355 [main] Config - Class Name: edu.rpi.legup.puzzle.shorttruthtable.ShortTruthTable
[DEBUG] 2020-10-05 17:39:12.355 [main] Config - Class Name: edu.rpi.legup.puzzle.sudoku.Sudoku
[DEBUG] 2020-10-05 17:39:12.355 [main] Config - Class Name: edu.rpi.legup.puzzle.treetent.TreeTent
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at edu.rpi.legup.ui.lookandfeel.materialdesign.MaterialDrawingUtils.getAliasedGraphics(MaterialDrawingUtils.java:19)
	at edu.rpi.legup.ui.lookandfeel.components.MaterialMenuUI.paint(MaterialMenuUI.java:32)
	at java.desktop/javax.swing.plaf.basic.BasicMenuItemUI.update(BasicMenuItemUI.java:620)
	at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
	at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
	at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
	at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5262)
	at java.desktop/javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:246)
	at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
	at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
	at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
	at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
	at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
	at java.desktop/java.awt.Container.paint(Container.java:2002)
	at java.desktop/java.awt.Window.paint(Window.java:3940)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
	at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
	at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
	at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
	at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1890)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

The exception and stack trace prints in a loop until the program is forcibly exited.

UID Backwards Compatibility Error Message

Once #93 is resolved, there will be a clear break in backwards compatibility between all version of Legup 3 and future versions of Legup. An error message should be displayed if a proof created in Legup 3 is attempted to be opened in Legup 4 (since that will not be possible).

LEGUP does not work unless run as Admin via PowerShell

On some Windows PCs, when you try to open LEGUP, you receive the following error:
image

When you attempt to run the program via the command line, you receive this error:
image (1)

The program only launches if you open a command prompt/powershell window as administrator and then attempt to launch the program from the command line.

Nurikabe White Bottleneck Rule Leads to Unsolvable Puzzle

When working with the following puzzle

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Legup version="2.0.0">
    <puzzle name="Nurikabe">
        <board height="7" width="7">
            <cells>
                <cell value="1" x="3" y="0"/>
                <cell value="6" x="4" y="2"/>
                <cell value="2" x="6" y="2"/>
                <cell value="4" x="4" y="4"/>
                <cell value="3" x="6" y="4"/>
                <cell value="3" x="3" y="6"/>
            </cells>
        </board>
    </puzzle>
</Legup>

at this position
image

Applying the white bottleneck rule is considered "valid" for both
image
and
image

From the first position, it is possible to derive this position with valid steps:
image

But as you can see, it is impossible to complete the puzzle in this state, thus I can contradict the whole thing

image

Even though this puzzle has a solution. The white bottleneck rule should probably not be applied to an ambiguous case such as this one where it can "escape" in multiple ways to avoid this false contradiction.

TODO: Standardize JComponent Size Issue

Figure out how the sizing is prioritized for different JComponents including JFrame and JPanels for visibility. Make sure they match at each level, and don't hard code the sizing. Especially for TreeView. Remove unnecessary setSize() and setPreferredSize() methods.

Case rule places light in invalid position

Light Up - Case Rule (why not like bottom branch)

The case rule in this puzzle file places a bulb in one of its branches in a square that's already illuminated by another light, which breaks the rules of Light Up. The relevant square is not manually confirmed to be empty when the case rule is applied, so it's not explicitly clear how LEGUP should handle the scenario. There are a few options:

  1. Refuse to apply a case rule in a situation in which it would produce one or more branches that are immediately invalid
  2. Modify the existing case rules to permit the creation of branches that are immediately invalid as long as the correct contradiction rule (in this case, "Bulbs in Path") is subsequently applied
  3. Avoid generating branches that lead to scenarios like this

Personally, I'm leaning towards the second option. What do other people think?

Light Up - Case Rule (why not like bottom branch).zip

Interacting With Previous State Prevents Placement

Current Behavior

If a previous state in the tree is accessed after a case rule has been used part or all of the current board will become unmodifiable. Image of unmodifiable state included:
image

Expected Behavior

The current state should still be modifiable.

Steps to Reproduce

Open a nurikabe a file. Create at least one valid state then use case rule. Once case rule has been used select a state before case rule and change and revert a tile in it. The current state after the case rule will now be unmodifiable.
Attached files with unmodifiable states:
CaseRuleError.zip

Short Truth-Table: Enhancement/Feature: Truth-values specified in puzzle file

Right now, the short truth-table puzzle assumes that the input is a bunch of statements, and that these statements reflect an argument, with the last one being the conclusion, and all others the premises. As such, LEGUP sets the last one to False (red), and the others to True (green).

Unfortunately, this makes it hard to explore other kinds of questions, such as "are these statements consistent?" (to check that, set all statements to True (green)), or "What kind of statement is this?" (if you work with that statement without setting any truth-value at all,, you may find it cannot be true (and hence its a contradiction), or that it cannot be false (so tautology), or that it can be eoither true or false (contingency).

So, to be handle to handle all those kinds of questions, we simply need to change it so that the input file can specify any kind of truth-value to any statement ... or specifies no truth-value at all. So for each statement associate a value of true, false, or neither

Short Truth Table IDs not working properly

Currently the prototype seems to work at saving and opening all puzzle files other than Short Truth Table. This is probably because Short Truth Table is structured differently with generics.

Legup Setup Guide

Create a setup guide for users of Legup. This setup guide should include common steps to troubleshoot, such as Java not being installed (and how to install it), how to run the program, preventing jar files from defaulting to Internet Explorer, as well as other common issues for both Mac and Windows computers. Including screenshots in this setup guide would be helpful for those that are not computer-savvy.

Short Truth-Table: Case rule bug

The user can simply set any statement to true/green or false/red, and then select the Atomic Case case Rule (the big fat P icon) and it will check out. This is not right: it should have a branch for true as well as for false. (and by the way: this is a really bad name tof rthis rule, because you can apply this rule to any statment, not just atomic cases (we probably had the rule intended for any atomic statement, but then figured we can apply it to any statement, but forgot to cvange the name of the rule)...ned a better icon as well!)

Likewise, the user can make any operator to green (or red), and select the corresponding operator Case Rule. Again, that should only check out when the other branch is also created, but now it checks out with just that one branch:

image

"Corners Black Out" not working

Current Behavior
There exists a case when the Corner Black Out rule should work but does not. Below is an image that demonstrates it not working correctly.

nurikabe_edit

It is impossible for the 2 to ever reach that so the corner should be able to get filled with a black square using this rule.

Expected Behavior
This rule should be valid for this case.

Steps to reproduce

  1. Download and extract Error File.zip
  2. Open the file in Legup
  3. Scroll to the right in the TreePanel and inspect the last rule
  4. You will see that you should be able to use the rule for that scenerio

Slow scroll in Case Rule selection

The current scroll speed in the Case Rule selection box (UI) is slower than the expected. It is currently more viable to drag down on the side scroller, which should not be the case.

Fix: increase scroll speed for mouse / touchpad

"No Number" not working

Current Behavior
There is a case where the contradiction No Number can incorrect be valid. An example is shown in the picture below.

nurikabe

This is assuming there is some white area that isn't a number surrounded by 4 black squares.

Expected Behavior
This should be invalid because there is no issue like that in the board.

Steps to reproduce

  1. Download and extract Error File.zip
  2. Open the file in Legup
  3. Go all the way to the right in the TreePanel and see the last rule
  4. You will see this is being marked as a valid rule when it should not be

Bug: Short Truth-Table: Or Elim checks out when it should not

image

See image: I made the A from line 1 True, and the Or Elim rule checked out. This should not be the case: just because the whole disjunction is True does not mean that A is True. The same thing happens when I set the right side to True (or both): the rule checks out, but it should not. I can even set one of the sides to False, and it will check out. Only when I set both sides to False will the rule not check out. So .. it seems like it's checking for compatibility (yes, it is compatible with the truth of the disjunctions that A is True ... or False for that matter), but the rule should of course be checking for whether the new values are forced.

Restructure Short Truth Table

When working with Short Truth Table, I found some of the generic classes in Short Truth Table seem entirely unnecessary. Restructuring the code and classes would make the puzzle easier to work with.

Short Truth Table Bug: And Elim Checks out when it should not

When you have a true Conjunction, with one of the conjuncts being false, then you can set the other Conjunct to false, and the Conjunction (And) Elimination rule will check out:

image

This should not happen: you can only set a conjunct to False if the Conjunction itself is False, and the other conjunct is True.

Short Truth Table

ASCII characters for logical operators are not displaying correctly.

Change the UI for the Rules menu

Currently, in order to see the name of a rule, the user must hover their mouse over an icon, which makes it cumbersome to find a particular rule. A simple solution to this is to display the name of the rule under the icon, though a more difficult one would be to implement a search bar for the rules.

Case Rule Error Messages not showing up properly

Current Behavior

Currently, when case rules are used to attempt to justify an action (and not actually used to create many cases), they don't properly show an error message in the bottom left corner. Refer to the screenshot below:
image

A proper error message should be something like the following (note: for this example, Fill In Black was used to attempt to justify the invalid move):
image

Expected Behavior

This error message should be appearing even when case rules are used to justify invalid moves.

Steps to Reproduce

I only reproduced this bug in Nurikabe and Light Up, but I'm pretty sure this can be replicated on any game besides Short Truth Table (since that's structured a bit differently). I have attached a sample file, but this issue can be reproduced by simply entering an invalid move and then attempting to justify it with a case rule.

8078467.zip

Force user to specify where on board Contradiction is

Issue #46 made me realize that we may want to force the user to indicate where on the board some contradiction is taking place. That is: right now, when the user selects a contradiction rule, the rule will check if anywhere on the board the indicated contradiction is taking place. The problem with this is that a user could conceivably simply willy-nilly try to select different contradiction rules and see if any happen to check out. If instead we force the user to somehow indicate where on the board a contradiction is taking place, such lucky blind guesses can be avoided.

Of course, the question is: how does the user indicate a contradiction? For some rules this would seem to be fairly obvious: Take the 'Too Few Lights' contradiction rule in Light-Up. Here, the user would simply click on the number that doesn't have (and cannot obtain) enough lights. Likewise, for the Can't Reach White Cell contradiction rule for Nurikabe mentioned in issue #46, the user would simply select the white cell that the user thinks cannot be reached. However, how would the user indicate a 2x2 block of black squares contradiction in Nurikabe ? Does the user really have to indicate all of those 4 squares? Or maybe at least just one of them? How about Isolated Black? Here the user has to identify two black cells that cannot be connected? But maybe there are some contradiction rules that are even harder to identify? Anyway, we can think about that.

One advantage of doing things this way is that we can implement the contradiction rules in accordance with the yuser's indications of suspected contradictions. Again, going back to issue #46: Tthe Can't Reach White Cell contradiction rule now gets a parameter that is the square under consideration, and the rule now sees whether that specific cell is indeed unreachable, rather than any cell being unreachable. And that will avoid the issue that was behind issue #46 in the first place, where the contradiction rule was simply looking for a contradiction anywhere on the board.

Nurikabe White Bottle Neck Rule Bug

Current Behavior

When multiple consecutive cells are selected for White Bottle Neck rule, Legup does not mark all the cells as valid, even when they are. Attached is an image of an example:
image

Note: I am not sure if this bug is also present for Black Bottle Neck rule, but since the logic of those two cells are quite similar, it could be possible.

Expected Behavior

All cells should be marked valid if they pass the White Bottle Neck rule.

Steps to Reproduce

Mark all cells that should be white due to bottlenecking as valid.

Note the the attached file only works on the pre-UID version of Legup.
nurikabe_white_escape_bug.zip

Required checkmark for each branch

We should require that the user manually verify each valid branch as successfully completing the puzzle with a new rule that's analogous to the existing contradiction rules.

"Fill in Black" not working

Current Behavior
When you have black and gray squares around a gray square, you can use the fill in black rule to claim that square should also be black. This is not valid reasoning as all squares must be black.

The following photo shows what the issue looks like. First a black square was placed to the left of the 6 using the Fill In Black rule which was clearly wrong. Next a black square was placed below using same rule except that was marked as valid when it does not make sense using the same rule.

nurikabe_edit

Expected Behavior
This rule should not be valid in cases like this. It must be that all 4 squares around a gray square are black in order for that gray square to be marked as black.

Steps to reproduce

  1. Download and extract Error File.zip
  2. Open the file in Legup
  3. Inspect the current rules and board in those rules
  4. You should see that the Fill In Black rule is marked as valid when it shouldn't be

Puzzle is Impossible to Solve

Puzzle is currently impossible to solve, used "Touching tents" and "Too few tents" to show this

image
image

Problem mainly arises from the tree in row E, which must have a tent beneath it in order to satisfy the number of tents per row rule. The rows in the top of the grid cannot satisfy the tents per row rule without contradicting the "touching tents" rule and vice versa
4614656 - Impossible to Solve.zip.

Auto-change Version Text

Instead of having the "Version 3.0.0" text have to be manually updated in future versions with a new image, change this to be added by the program like the "Loading..." text. This information can be grabbed from wherever the version number is stored in the program. Additionally, this information should also be changed in the preferences menu and any other place the version of Legup is displayed.

To do:

  • Change version text on splash screen
  • Change version text in preferences menu

Note: this issue should be updated with any other locations that the version text should be changed in the future

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.