Code Monkey home page Code Monkey logo

pjdude / dude Goto Github PK

View Code? Open in Web Editor NEW
55.0 4.0 5.0 4.61 MB

Duplicates Detector is a cross-platform GUI utility for finding duplicate files, allowing you to delete or link them to save space. Duplicate files are displayed and processed on two synchronized panels for efficient and convenient operation.

Home Page: https://pjdude.github.io/dude/

License: MIT License

Python 98.47% Shell 0.55% Batchfile 0.94% HTML 0.04%
duplicate-detection duplicate-files duplicates duplicates-removal python tkinter deduplication sha1 utility utility-application

dude's Introduction

DUDE (DUplicates DEtector)

A cross-platform GUI utility for finding duplicated files, delete or link them to save space.

Features:

  • Scanning for duplicate files in multiple designated folders (up to 8). Optional "Cross paths" mode
  • Optional command line parameters to start scanning immediately or integrate Dude with your favorite file manager
  • Two synchronized panels:
    • groups of duplicates
    • directory of selected file
  • Two stage processing:
    • interactive marking of files with multiple criteria
    • taking action on marked files (Move to Trash/Recycle Bin, delete, hard-link, soft-link, create windows .lnk shortcut file)
  • Support for regular expressions or glob expressions syntax
  • Searching for duplicates based on the hash of the file content. Different filenames or extensions do not affect the search results
  • Works on Linux and Windows

Why another anti-duplicate application ?

  • Because you need to see the context of removed files, and use such application clearly,safely and easily.

Screenshots:

GUI usage example:

image info

immediate scanning start with CLI parameters example:

image info

settings dialog:

image info

Download:

Portable executable packages created with PyInstaller for Linux and Windows can be downloaded from the Releases site. At the same time, separate builds are created with the Nuitka compiler.

General usage:

  • Scan for duplicate files
  • Mark files for processing
  • Take action on marked files (delete, softlink, hardlink)

Usage tips:

  • Use keyboard shortcuts. All are described in the context menus of the main panels. As a general rule, actions with Ctrl key apply to all files/groups, without Ctrl work locally. Start by utilizing just Tab, arrows, F5, space, and Delete.
  • Sometimes it is more efficient to operate on entire folders than on CRC groups, so don't ignore lower panel, use Tab and F5 (F6)
  • Narrow down the scanning area, exclude from scanning unnecessary folders (e.g. Windows system folder which is full of duplicates), you can always add multiple (up to 8) independent scan paths
  • Modify on your PATH environmental variable to to point to the Dude binary for more convenient and faster command line operation
  • The performance of the scanning process (or of any other software that requires frequent or extensive access to files in general) may be degraded by the atime attribute of the scanned file system. Disabling it on Linux file systems may be done usually by applying the noatime attribute in fstab, on Windows/NTFS it is the disablelastaccess option available with the fsutil command or by modifying the registry.

Supported platforms:

  • Linux
  • Windows (10,11)

Command line examples:

  • Start scanning for duplicates in current directory:
dude .
  • Start scanning in specified directories:
dude c:\order d:\mess
  • Generate csv with report, exclude some paths:
dude ~ --exclude "*.git/*" --csv result.csv ; note the quotation marks on asterisks
dude.exe c:\ --exclude *windows* --csv result.csv
  • check full set of available parameters:
dude --help

Portability

Dude writes log files, configuration and cache files in runtime. Default location for these files is dude.data folder, created next to the dude executable file. If there are no write access rights to such folder, platform-specific folders are used for cache, settings and logs (provided by appdirs module). You can use --appdirs command line switch to force that behavior even when dude.data is accessible.

Technical information

  • Scanning process analyzes selected paths and groups files with the same size. Dude compare files by calculated SHA1 hash of file content. CRC calculation is done in separate threads for every identified device (drive). Number of active threads is limited by available CPU cores. Aborting of CRC calculation gives only partial results - not all files may be identified as duplicates. Restarted scanning process will use cached data. The CRC is always calculated based on the entire contents of the file.

  • scanning (CRC calculation to be precise) is done in specific order, that try to identify duplicates in folders with biggest potential duplicates. In case of huge filesystems, when scan is aborted, partial results are more useful then.

  • Calculated CRC is stored in internal cache which allows re-use it in future operation and speedup of searching of duplicates (e.g. with different set of search paths). Key of cache database is pair of inode of file and file modification time stored separately for every device-id, so any file modification or displacement will result in invalidation of obsolete data and recalculation of CRC.

  • Scanning or marking files does not cause any filesystem change. Any file deletion or linking needs confirmation and is logged.

  • Just before files processing, state of files (ctime) is compared with stored data. In case of inconsistency (state of files was changed somehow during operation between scanning/CRC calculation and files processing) action is aborted and data invalidated.

  • Dude is written in python3 with Tkinter and packed with PyInstaller to portable distribution. GitHub release build for linux platform is done in ubuntu-20.04 container. In case of glibc incompatibility it is always possible to build Your own binary (pyinstaller.run.sh) or run python script (dude.py)

  • Dude for windows is build as two binary executables: dude.exe and dudecmd.exe. They should be saved in the same path. dudecmd.exe is basically only to respond to the console to --help parameter or for passing command line parameters (if correct) to dude.exe. dude.exe will also accept parameters but will not respond to the console. dudecmd.exe will leave windows command line window open for time of operation.

  • Soft links to directories are skipped during the scanning process. Soft links to files are ignored during scanning. Both appear in the bottom "folders" pane.

  • Hard links (files with stat.st_nlink>1) currently are ignored during the scanning process and will not be identified as duplicates (within the same inode obviously, as with other inodes). No action can be performed on them. They will only appear in the bottom "folders" pane. This may change in the future versions.

  • the "delete" action moves files to Recycle Bin / Trash or deletes them permanently according to option settings.

Manual build (linux):
pip install -r requirements.txt
./scripts/icons.convert.sh
./scripts/version.gen.sh
./scripts/pyinstaller.run.sh
Manual build (windows):
pip install -r requirements.txt
.\scripts\icons.convert.bat
.\scripts\version.gen.bat
.\scripts\pyinstaller.run.bat
Manual running of python script:
pip install -r requirements.txt
./scripts/icons.convert.sh
./scripts/version.gen.sh

python ./src/dude.py

Licensing

dude's People

Contributors

pjdude 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

Watchers

 avatar  avatar  avatar  avatar

dude's Issues

Win 7?

Does this work with Win 7?

Thanks

GUI: `All Files / Mark Oldest files` mark files that have latest `ctime`

Describe the bug
Open GUI, perform a scan, in the CRC groups window, I see 2 copies with the ctime field values:

2019/07/24 21:27:02
2015/05/17 07:01:15

If I right click and select All Files / Mark Oldest files, all that are 2019/07/24 21:27:02 will be selected.

To Reproduce
Steps to reproduce the behavior:

  1. Open GUI, perform a scan with duplicates exist
  2. On the CRC group panel, right click and select All Files / Mark Oldest files
  3. Files with latest ctime are chosen

Expected behavior
Since it says Mark Oldest files, I think the 2015/05/17 07:01:15 ones should be chosen.

Desktop (please complete the following information):

  • OS: Windows 11

Additional context

I am on Dude-Nuitka Release v1.0361.446

Allow unicode chars in "Exclude from scan" entries

Is your feature request related to a problem? Please describe.
In the GUI scan window, Exclude from scan is useful for duplicates that I want to keep.

But it currently doesn't support unicode input.

If input is not ascii, an error will be shown1:

scan 'ascii' codec can't encode characters in position NN-NN: ordinal not in range(128)

Describe the solution you'd like
It's good to have it support unicode string.

Additional context
Tested on Dude-Nuitka Release v1.0361.446


Footnotes

  1. screenshot: https://github.com/PJDude/dude/assets/62105/ed75f4e3-8d21-49e5-9848-a77a4f57f77c

Windows: error when deleting `xxx.html` and its connected `xxx_files` folder

Describe the bug

On Windows, when saving a webpage with Microsoft Edge, the following files will be created:

a_web_page.html
a_web_page_files/some.js
a_web_page_files/some.css
a_web_page_files/some.jpg
....

Using dude mark and remove them will result an error when deleting.

I could see [Errno 2] or [Errno 3] errors in my cases.

Delete error:[Errno 3] The system cannot find the path specified.: ....

or

Delete error:[Errno 2] The system cannot find the file specified.: .. ..

Screenshots are attached.

To Reproduce

Steps to reproduce the behavior:

  1. on Windows, use Microsoft Edge to save https://github.com/PJDude/dude/releases, file type set to webpage, full1
  2. create a folder 1 to hold them
  3. make a copy of 1 into 2 2
  4. open dude GUI
  5. scan folder 1 & 2
  6. mark folder 2
  7. remove marked files
  8. error windows pop up, for deleting files and empty folders 34

Expected behavior

There should be no errors,
and should be able to continue to remove the rest files that are not related with these html files

Desktop (please complete the following information):

  • OS: Windows 11
  • Dude v1.0371.550

Additional context

I guess it's related to a weird feature called Connected Files in Windows.

When you remove a html file, its connected *_files folder will also be removed automatically,
so the succeeding deletions in the queue would fail.

I don't know how it is implemented in Windows.
Is it via the syscall so that every deletion will always trigger this behavior?
If so, then we can only skip this kind of errors, I think.

Anyway, I think there should be an option to skip errors during deletion,
so I can make it continue to go with the rest files without re-scanning and re-marking.


Screenshots:

Footnotes

  1. download html: https://github.com/PJDude/dude/assets/62105/ce2ad81f-5d52-450a-acd8-cea665c9b040

  2. make a dup: https://github.com/PJDude/dude/assets/62105/d84ec025-9bd3-4aa0-8cc3-b8b9b1dd61de

  3. deleting error: https://github.com/PJDude/dude/assets/62105/7a4a2a0a-28d2-493c-a859-a7b4655bf52f

  4. emptying dir error: https://github.com/PJDude/dude/assets/62105/c9c2f154-f6e0-4a3a-b7e4-1d2c8e1edd48

Allow to set source and destination folders

I very often want to use dude to compare the contents of an SD to a disk (in which most of files have been copied and distributed across different folders), before cleaning up the SD. For some reason, just adding the 2 directories (SD and drive) and running dude with default options takes a very long time. I presume this is because the (large) drive is searched for duplicates within itself. I would like to run dude so that only files in the SD are searched for duplicates in the disk drive. Perhaps this is possible already with some combination of options, but cannot find them.

`groups_show` [Errno 22] Invalid argument

Describe the bug

Dude error when rendering results:

INTERNAL_ERROR logwrapper_wrapp
groups_show [Errno 22] Invalid argument

Screenshot attached.1 Also the log says2:

2024-02-09 03:34:10,551 ERROR logwrapper_wrapp func:groups_show error:[Errno 22] Invalid argument args:() kwargs: {}
2024-02-09 03:34:10,552 ERROR   File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 4923, in <module>
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 973, in __init__
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 2959, in scan_dialog_show
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dialogs.py", line 170, in show
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\tkinter\__init__.py", line 734, in wait_variable
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\tkinter\__init__.py", line 1967, in __call__
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 2635, in scan_wrapper
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 274, in restore_status_line_wrapp
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 259, in logwrapper_wrapp
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 2942, in scan
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 223, in block_wrapp
  File "C:\Users\user\DOWNLO~1\DUDE-V~1.524\dude.py", line 265, in logwrapper_wrapp

I only encountered the problem on this specific path (the dir with the longer name in the screenshot):

Z:\00edu\not yet\2\2004-01-17 school [008 CD]{2480P}\school\School-1\JAVA應用\博碩\pg20097解答\ch14\

And the directory contains only a file:

hw14_9.java

The folder with the shorter name has only a file too, same file name and content.

If I copy ...博碩\pg20097解答\ch14\hw14_9.java to somewhere else like C:\Users\user\some_dir, and perform a scan,
everything is just fine.

Even if I re-create the same directory tree by mkdir -p on the other drive (e.g.: D:\), it won't cause errors.

Since the original directory was created in 2000's, I suspect there is an OS-specific encoding issue, or some unprintable characters in that path name.

I want to preserve the original folders as possible as I could so I haven't tried to alter the problematic folder tree yet.

Expected behavior

I expected there is no error during the rendering phase and all the CRC groups should be displayed correctly.

Version

  • OS: Windows 11
  • tried on v1.0361.446, v1.0371.550 & v1.0372.524

Footnotes

  1. error screenshot: https://github.com/PJDude/dude/assets/62105/65d82aa3-a33d-4536-8e61-96667d76296f

  2. log file: https://github.com/PJDude/dude/files/14214090/2024_02_09_03_33_08.txt

GUI: `tree_sort_item` item not found and `folder_tree_sel_change` item not found

Describe the bug

While it is removing marked files, I accidentally click Size column header at the CRC group window.

And then a window pops up1:

tree_sort_item item some_hash not found

I clicked OK, and about 5 minutes later, another window pops up2:

folder_tree_sel_change item some_id not found

Screenshots are attached.

Since the log file is big and seems not aware of unicode chars (ERROR [Errno 2]..., INFO deleting file to trash...),
I paste only the error sections at the bottom.

Meanwhile, the deleting process keeps going and all the marked files are removed correctly. (looks like :P)

To Reproduce

  1. scan and mark lots of files, in my case, 9731 files with several .html & _files(connected file).
  2. right click > All Files > Remove All Marked Files
  3. proceed to start deleting
  4. click Size column header at the CRC group window
  5. got tree_sort_item error
  6. click OK and wait for another minutes
  7. got folder_tre_sel_change error

Expected behavior

Should not get an error, or
the column header shouldn't be click-able during deletion.

Environment

  • OS: Windows 11
  • Dude v1.0373.506

All of my files are on a samba share, so the deletion response time could be longer than on normal disks.

The files to be deleted contain lots of Windows Connected Files (.html and _files), so I have disabled abort_on_error

cfgs.ini

[main]
cross_mode = 1
show_full_crc = 0
show_full_paths = 0
excluderegexpp = 0
exclude = 
relative_symlinks = 1
erase_empty_dirs = 1
abort_on_error = 0
send_to_trash = 1
confirm_show_crcsize = 0
confirm_show_links_targets = 1
allow_delete_all = 0
skip_incorrect_groups = 1
allow_delete_non_duplicates = 0
file_open_wrapper = 
folders_open_wrapper = 
folders_open_wrapper_params = 2

[geometry]
sash_coord = 400
main = 1200x781+683+150

Log lines: tree_sort_item

2024-02-10 12:51:20,621 INFO STATUS:processing files 6352 ...
2024-02-10 12:51:20,640 INFO logwrapper 'column_sort_click' start
2024-02-10 12:51:20,640 INFO logwrapper 'column_sort' start
2024-02-10 12:51:20,640 INFO STATUS:Sorting...
2024-02-10 12:51:20,692 INFO logwrapper 'tree_sort_item' start
2024-02-10 12:51:20,692 INFO STATUS:logwrapper_wrapp func:tree_sort_item error:Item 685a8d76aaac7c793bb3705c3067d35a67489659 not found args:(<tkinter.ttk.Treeview object .!panedwindow.!frame.!treeview>, None, False) kwargs:{}
2024-02-10 12:51:20,730 ERROR logwrapper_wrapp func:tree_sort_item error:Item 685a8d76aaac7c793bb3705c3067d35a67489659 not found args:(<tkinter.ttk.Treeview object .!panedwindow.!frame.!treeview>, None, False) kwargs: {}
2024-02-10 12:51:20,731 ERROR   File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4923, in <module>
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 982, in __init__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1504, in mainloop
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1967, in __call__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2400, in <lambda>
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 223, in block_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4016, in process_files_in_groups_wrapper
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 223, in block_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4523, in process_files
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4335, in process_files_core
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 1643, in status_main_win
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 1640, in status_main
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1372, in update
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1967, in __call__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2167, in tree_on_mouse_button_press
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2556, in column_sort_click
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 286, in restore_status_line_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 223, in block_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2608, in column_sort
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 265, in logwrapper_wrapp

2024-02-10 12:51:20,732 INFO STATUS:Creating dialog ...
2024-02-10 12:51:20,744 INFO STATUS:logwrapper_wrapp func:tree_sort_item error:Item 685a8d76aaac7c793bb3705c3067d35a67489659 not found args:(<tkinter.ttk.Treeview object .!panedwindow.!frame.!treeview>, None, False) kwargs:{}
2024-02-10 12:52:15,987 INFO logwrapper 'tree_sort_item' end. BENCHMARK TIME:55.29593219999515
2024-02-10 12:52:16,006 INFO logwrapper 'column_sort' end. BENCHMARK TIME:55.366618500003824
2024-02-10 12:52:16,008 INFO STATUS:processing files 6352 ...

Log lines: folder_tree_sel_change

2024-02-10 12:56:47,399 INFO deleting file to trash:Z:\00_edu\not_yet\2\2004-01-17 school [008 CD]{2480P}\school\wwwroot\KJASP\ch08\Marf2.asp
2024-02-10 12:56:47,518 INFO remove_from_data_pool size:250 crc:56d919ee7265b38a6649fcdbfb52314768891245 tuples:[(1, '\\school\\wwwroot\\KJASP\\ch08', 'Marf2.asp', 1002188450610000000, 3491925256, 17094)]
2024-02-10 12:56:47,519 INFO STATUS:processing files 8672 ...
2024-02-10 12:56:47,605 INFO STATUS:catched_wrapp func:folder_tree_sel_change error:Item 37256 not found args:('37256',) kwargs:{}
2024-02-10 12:56:47,606 ERROR catched_wrapp func:folder_tree_sel_change error:Item 37256 not found args:('37256',) kwargs: {}
2024-02-10 12:56:47,606 ERROR   File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4923, in <module>
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 982, in __init__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1504, in mainloop
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1967, in __call__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2400, in <lambda>
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 223, in block_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4016, in process_files_in_groups_wrapper
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 223, in block_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4523, in process_files
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 259, in logwrapper_wrapp
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 4335, in process_files_core
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 1643, in status_main_win
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 1640, in status_main
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1372, in update
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\tkinter\__init__.py", line 1967, in __call__
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 2178, in tree_on_mouse_button_press
  File "D:\ProgramFiles\dude.v1.0373.506.nuitka.portable.windows\dude.py", line 250, in catched_wrapp

2024-02-10 12:58:22,557 INFO deleting file to trash:Z:\00_edu\not_yet\2\2004-01-17 school [008 CD]{2480P}\school\wwwroot\KJASP\ch08\Marf4.asp

Footnotes

  1. tree_sort_item: https://github.com/PJDude/dude/assets/62105/5849d4c3-6089-443b-8d2d-dae8f0d90dc3

  2. folder_tree_sel_change: https://github.com/PJDude/dude/assets/62105/cd40e260-3531-4ee4-943b-dc8b040820ce

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.