codeigniter4 / codeigniter4 Goto Github PK
View Code? Open in Web Editor NEWOpen Source PHP Framework (originally from EllisLab)
Home Page: https://codeigniter.com/
License: MIT License
Open Source PHP Framework (originally from EllisLab)
Home Page: https://codeigniter.com/
License: MIT License
Might make sense to move this to the Forge class? Probably not, though it would make sense if that was renamed to Schema...
Would love a backup and import function that could save out and read back the schema to the exact point. Could be a nice other option for migrations - complete database schema dumps by date....
Development Checklist:
SL Insight reports an "info" item: Keeping only one class per file is a standard in the PHP community, since it promotes interoperability and maintainability.
Excluding Kint, we have three violators:
Each of these defines one or more namespaced exceptions, for clarity.
It seems silly to have each of these in their own file, given that they basically extend a parent Exception class. I am not sure if having these in separate files would complicate things like the classmap or loading time.
Thoughts?
Can we configure SL Insight to ignore the third party packages?
Kint, in particular, triggers a large number of deemed errors.
These should not be part of the framework analysis.
Would one answer be to keep third party stuff external to the system folder? eg in /vendor or in /thirdparty if we did not want to mess up conventional composer usage?
windows OS
define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));
var_dump(SYSDIR);
string(0) ""
Fix:
define('SYSDIR', trim(strrchr(trim(str_replace('', '/', BASEPATH), '/'), '/'), '/'));
When AutoRoute, It seems if we add arguments to URI segments like http://localhost/controller/method/arg
, the arguments are not passed to the controller method.
Just not implemented the logic yet?
Sorry for barking so early. :-)
Sample APPPATH, SYSPATH usage:
https://github.com/lonnieezell/CodeIgniter4/blob/develop/application/config/autoload.php#L33
Is it possible these constants to be renamed or name-spaced? Maybe in the distant future I'll make an attempt for compatibility layer about CI3. A name collision between certain CI3 and CI4 constants seems to me an obstacle for this goal.
We can't see the Welcome page, because the response header is invalid.
HTTP/ 200 OK <-- here
Host: localhost:8000
Connection: close
X-Powered-By: PHP/7.0.4
Cache-control: no-store, max-age=0, no-cache
Content-type: text/html; charset=UTF-8
We should set protocolVersion somewhere, but I'm not sure where should be.
windows OS
...\system\Debug\Toolbar\View\toolbar.tpl.php
$value) : ?><?php if (empty($value)) continue; ?> <tr> <td><?= esc($value->getName()) ?></td> <td><?= esc($value->getValueLine()) ?></td> </tr> <?php endforeach; ?>
var_dump($headers);
from this it follows that $value === string or $value === array
array(14) {
["Host"]=>
array(2) {
[0]=>
string(7) "ci4.loc"
[1]=>
object(CodeIgniter\HTTP\Header)#9 (2) {
["name":protected]=>
string(4) "Host"
["value":protected]=>
string(7) "ci4.loc"
}
}
["X-Real-IP"]=>
string(9) "127.0.0.1"
["X-Forwarded-For"]=>
array(2) {
[0]=>
string(9) "127.0.0.1"
[1]=>
object(CodeIgniter\HTTP\Header)#11 (2) {
["name":protected]=>
string(15) "X-Forwarded-For"
["value":protected]=>
string(9) "127.0.0.1"
}
}
["Connection"]=>
array(2) {
[0]=>
string(5) "close"
[1]=>
object(CodeIgniter\HTTP\Header)#12 (2) {
["name":protected]=>
string(10) "Connection"
["value":protected]=>
string(5) "close"
}
}
["User-Agent"]=>
array(2) {
[0]=>
string(78) "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
[1]=>
object(CodeIgniter\HTTP\Header)#13 (2) {
["name":protected]=>
string(10) "User-Agent"
["value":protected]=>
string(78) "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
}
}
["Accept"]=>
array(2) {
[0]=>
string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"
[1]=>
object(CodeIgniter\HTTP\Header)#14 (2) {
["name":protected]=>
string(6) "Accept"
["value":protected]=>
string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"
}
}
["Accept-Language"]=>
array(2) {
[0]=>
string(35) "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
[1]=>
object(CodeIgniter\HTTP\Header)#15 (2) {
["name":protected]=>
string(15) "Accept-Language"
["value":protected]=>
string(35) "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
}
}
["Accept-Encoding"]=>
array(2) {
[0]=>
string(13) "gzip, deflate"
[1]=>
object(CodeIgniter\HTTP\Header)#16 (2) {
["name":protected]=>
string(15) "Accept-Encoding"
["value":protected]=>
string(13) "gzip, deflate"
}
}
["DNT"]=>
string(1) "1"
["Pragma"]=>
array(2) {
[0]=>
string(8) "no-cache"
[1]=>
object(CodeIgniter\HTTP\Header)#18 (2) {
["name":protected]=>
string(6) "Pragma"
["value":protected]=>
string(8) "no-cache"
}
}
["Cache-Control"]=>
array(2) {
[0]=>
string(8) "no-cache"
[1]=>
object(CodeIgniter\HTTP\Header)#19 (2) {
["name":protected]=>
string(13) "Cache-Control"
["value":protected]=>
string(8) "no-cache"
}
}
["Content-Type"]=>
bool(false)
["X-Real-Ip"]=>
object(CodeIgniter\HTTP\Header)#10 (2) {
["name":protected]=>
string(9) "X-Real-Ip"
["value":protected]=>
string(9) "127.0.0.1"
}
["Dnt"]=>
object(CodeIgniter\HTTP\Header)#17 (2) {
["name":protected]=>
string(3) "Dnt"
["value":protected]=>
string(1) "1"
}
}
Is there coding style checker (and/or fixer) for CI4 like php-cs-fixer?
This trait would provide a standardized way to respond from controllers when creating an API. The primary benefits are 2-fold:
[NEEDS MORE INFO]
Development Checklist:
There should be a way to enforce that a route can only be reached through HTTPS. This would be passed as an option to that route (or route group). If it's accessed via HTTP then it should be redirected to HTTPS.
I noticed that the session interface defines an unset()
method. I'm thinking it's not a safe name because of php's unset() (that isn't a function, but a Language construct, as reported here).
I would use another name, such remove()
or delete()
Development Checklist:
To help address Unvalidated Redirects and Forwards, the redirect()
method should be able to restrict the URL to only URL's that have been defined in the routes file.
This should take effect by default, when the app is set to require all URL's to be routed.
It would be nice to have a way for it to be able to auto-detect a whitelist of URLs that can be used for this, but will need to be determined.
Need to add Reverse Routing ability to the router library for a couple of reasons:
redirect()
method to only routes that exist on the site (assuming that the app is requiring all routes to exist in the routes file. This helps to address the OWASP's Unvalidated Redirects and Forwards attack.With the current implementation, we can only connect to databases with values in the config file. Not cool, and needs to be corrected to allow custom config arrays to be passed instead of the group name.
In the BaseConnection and MySQLi\Connection, setDatabase()
and getVersion()
are missing their access/visibility keywords:
abstract function setDatabase(string $databaseName);
abstract function getVersion();
function setDatabase(string $databaseName)
{
}
function getVersion()
{
}
I would assume they should be public, but I figured I'd call it out just in case.
Error
Class 'Config\App' not found
BASEPATH/CodeIgniter.php at line 163
155
156 Hooks::trigger('pre_system');
157
158 //--------------------------------------------------------------------
159 // Get our Request and Response objects
160 //--------------------------------------------------------------------
161
162 $config = new \Config\App();
163
164 $request = is_cli()
165 ? Services::clirequest($config)
166 : Services::request($config);
167 $request->setProtocolVersion($_SERVER['SERVER_PROTOCOL']);
168 $response = Services::response();
169
Development Checklist:
In Services, $getShared = false
is the default.
/**
* The Response class models an HTTP response.
*/
public static function response(App $config = null, $getShared = false)
{
if (! is_object($config))
{
$config = new App();
}
if (! $getShared)
{
return new \CodeIgniter\HTTP\Response($config);
}
return self::getSharedInstance('response');
}
When I want to get the shared object, if I write Services::response(null, true);
, it creates new App object.
If the code is like the following, I could write just Services::response()
.
public static function response(App $config = null, $getShared = false)
{
if ($getShared)
{
return self::getSharedInstance('response');
}
if (! is_object($config))
{
$config = new App();
}
return new \CodeIgniter\HTTP\Response($config);
}
And in the system code, it seems we have more true
use cases than false
cases.
My question is, do you have any reason that we set the default false
?
I've been thinking about how the toolbar collectors work lately, and think it might make more sense to have some of the modified to fire events instead of storing data that is accessed by the Collectors. This is cleaner code, and allows for a lot more flexibility. The database engine is the first one that really makes to me. By having events fired off listeners could be provided that:
This would require refactoring the Database class to fire an event, and create a new listener for collecting the query information.
Enhancement Checklist:
phpDocumentor2 does not properly recognize the hinted return type in PHP7.
In order to generate phpdocs for CI4, the return types in method signatures have been commented out for now. They can be restored using a global search & replace once phpDocumentor has addressed their issue.
Desired: function banana(): fruit
Workaround: function banana()//: fruit
Or, for an interface...
Desired: function banana(): fruit;
Workaround: function banana();//: fruit;
I see the Loader Class does not actually load a file, but it just locates non-class files. Hence I propose rename it to FileLocator and move it under the CodeIgniter\Autoloader namespace.
If you're ok with it I can take the burden :)
Per the specs, implement helper functions for CSP. This would likely be additional methods in the Response class to handle it. It looks like this will likely require the use of a separate class, if only to provide a way to work with nonces for script and style tags.
This is a new class that takes the place of CI3's File_Uploader class.
Most of the image features should be handled through a new Image class.
Development Checklist:
Should list common security issues, their risks, and how to use the tools within CodeIgniter to prevent or minimize them.
See Rails' Security docs for a great example.
Should show event name and timing, both in it's own tab and in the timeline.
Development Checklist:
For reference, the content of getEnvValue()
currently looks like this:
if ($value = getenv("{$shortPrefix}.{$property}"))
{
return $value;
}
else if ($value = getenv("{$prefix}.{$property}"))
{
return $value;
}
else if ($value = getenv($property))
{
return $value;
}
This would appear to prevent setting values such as 0, "0", an empty string, empty array, etc. You've worked around the boolean false by allowing conversion of the string 'false' in the constructor, but most of the other loose comparisons still apply within the getEnvValue()
method itself. Fixing this would likely require three separate if comparisons using $value === false
.
In HTTP/2 we can specify multiple static resources to be sent through Link headers. Our current implementation supports multiple values for a single header, but not multiple headers of the same name. We need to revise this to support multiple headers of same name to allow for HTTP/2 optimization.
Enhance the toolbar for better usability and display.
Enhancement Checklist:
$ phpunit --colors --coverage-text=coverage.txt --coverage-html=coverage/
PHPUnit 5.0.9 by Sebastian Bergmann and contributors.
............................................................... 63 / 145 ( 43%)
............................................................... 126 / 145 ( 86%)
................... 145 / 145 (100%)
Time: 11.14 seconds, Memory: 10.00Mb
OK (145 tests, 268 assertions)
Generating code coverage report in HTML format ...PHP Notice: Constant CI_VERSION already defined in /mnt/project/system/CodeIgniter.php on line 17
PHP Stack trace:
PHP 1. {main}() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:47
PHP 3. PHPUnit_TextUI_Command->run() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:105
PHP 4. PHPUnit_TextUI_TestRunner->doRun() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:154
PHP 5. PHP_CodeCoverage_Report_HTML->process() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:486
PHP 6. PHP_CodeCoverage->getReport() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php:68
PHP 7. PHP_CodeCoverage_Report_Factory->create() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:126
PHP 8. PHP_CodeCoverage->getData() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php:24
PHP 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:160
PHP 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:618
PHP 11. include_once() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:645
PHP 12. define() /mnt/project/system/CodeIgniter.php:17
Notice: Constant CI_VERSION already defined in /mnt/project/system/CodeIgniter.php on line 17
Session/SessionInterface has function 'unset', but that is a reserved name in PHP7.
This propagates to Session/Session.
It doesn't look like the method is called anywhere, though there are lots of calls to the global function 'unset'.
Should the method be renamed?
The caching built into the Query Builder just complicates things for no real reason that we can determine. Strip it out. Those that do use it can simple clone()
the Query Builder if they need to, now that it's a separate class.
Need to make sure the docs match up to the current state of code. While I've got a couple of people assigned to this task, feel free to send PR requests for docs if you want!
There are still some exit()
s. It stops phpunit. We can't test.
I hope at least to remove exit()
in helper functions.
https://github.com/lonnieezell/CodeIgniter4/blob/develop/system/HTTP/IncomingRequest.php#L307
It sets a cookie to a response, doesn't it?
Should provide a simple method that can be used to throttle, or rate limit any action with the following constraints:
Development Checklist:
We can currently check if a file exists using dot syntax to dig into arrays, but need to implement this feature for getFile()
also.
Enhancement Checklist:
Create a new helper method for doing testing that allows us to assert that a log action was performed. Should allow verifying log level and message as options or maybe better as different methods?
Now I can't generate code coverage report.
[vagrant@localhost project]$ phpunit --colors --coverage-text=coverage.txt --coverage-html=coverage
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.
............................................................... 63 / 272 ( 23%)
............................................................... 126 / 272 ( 46%)
............................................................... 189 / 272 ( 69%)
............................................................... 252 / 272 ( 92%)
.................... 272 / 272 (100%)
Time: 15.86 seconds, Memory: 14.00Mb
OK (272 tests, 514 assertions)
Generating code coverage report in HTML format ...PHP Fatal error: Cannot declare class CodeIgniter\PageNotFoundException, because the name is already in use in /mnt/project/system/Debug/CustomExceptions.php on line 49
PHP Stack trace:
PHP 1. {main}() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:47
PHP 3. PHPUnit_TextUI_Command->run() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:105
PHP 4. PHPUnit_TextUI_TestRunner->doRun() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:154
PHP 5. PHP_CodeCoverage_Report_HTML->process() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:486
PHP 6. PHP_CodeCoverage->getReport() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php:68
PHP 7. PHP_CodeCoverage_Report_Factory->create() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:144
PHP 8. PHP_CodeCoverage->getData() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php:24
PHP 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:178
PHP 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:680
PHP 11. include_once() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:707
Fatal error: Cannot declare class CodeIgniter\PageNotFoundException, because the name is already in use in /mnt/project/system/Debug/CustomExceptions.php on line 49
Call Stack:
0.0041 355592 1. {main}() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:0
0.0349 1003128 2. PHPUnit_TextUI_Command::main() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:47
0.0349 1003240 3. PHPUnit_TextUI_Command->run() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:105
0.7600 4106488 4. PHPUnit_TextUI_TestRunner->doRun() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:154
15.8625 10192872 5. PHP_CodeCoverage_Report_HTML->process() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:486
15.8630 10192928 6. PHP_CodeCoverage->getReport() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php:68
15.8650 10213464 7. PHP_CodeCoverage_Report_Factory->create() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:144
15.8651 10213464 8. PHP_CodeCoverage->getData() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php:24
15.8651 10213464 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:178
15.9923 10478424 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:680
15.9972 10538168 11. include_once('/mnt/project/system/Debug/Exceptions.php') /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:707
This is because of the following require
:
--- a/system/Debug/Exceptions.php
+++ b/system/Debug/Exceptions.php
@@ -35,7 +35,7 @@
* @filesource
*/
-require dirname(__FILE__).'/CustomExceptions.php';
+require_once dirname(__FILE__).'/CustomExceptions.php';
class Exceptions
{
The above patch fixes the error but then it seems it shows debug bar and raise another error:
PHP Fatal error: Uncaught Error: Call to undefined method PHP_CodeCoverage::renderTimeline() in /mnt/project/system/Debug/Toolbar/View/toolbar.tpl.php:38
Stack trace:
#0 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(707): include_once()
#1 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(680): PHP_CodeCoverage->processUncoveredFileFromWhitelist('/mnt/project/sy...', Array, Array)
#2 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(178): PHP_CodeCoverage->addUncoveredFilesFromWhitelist()
#3 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php(24): PHP_CodeCoverage->getData()
#4 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php(144): PHP_CodeCoverage_Report_Factory->create(Object(PHP_CodeCoverage))
#5 /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php(68): PHP_CodeCoverage->getReport()
#6 /home/vagrant/.composer/vendor/phpunit/phpunit in /mnt/project/system/Debug/Toolbar/View/toolbar.tpl.php on line 38
Fatal error: Uncaught Error: Call to undefined method PHP_CodeCoverage::renderTimeline() in /mnt/project/system/Debug/Toolbar/View/toolbar.tpl.php on line 38
Error: Call to undefined method PHP_CodeCoverage::renderTimeline() in /mnt/project/system/Debug/Toolbar/View/toolbar.tpl.php on line 38
Call Stack:
0.0059 355592 1. {main}() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:0
0.0361 1003128 2. PHPUnit_TextUI_Command::main() /home/vagrant/.composer/vendor/phpunit/phpunit/phpunit:47
0.0361 1003240 3. PHPUnit_TextUI_Command->run() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:105
0.5748 4106488 4. PHPUnit_TextUI_TestRunner->doRun() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/Command.php:154
15.0706 10192872 5. PHP_CodeCoverage_Report_HTML->process() /home/vagrant/.composer/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:486
15.0711 10192928 6. PHP_CodeCoverage->getReport() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php:68
15.0756 10213464 7. PHP_CodeCoverage_Report_Factory->create() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:144
15.0757 10213464 8. PHP_CodeCoverage->getData() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php:24
15.0757 10213464 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:178
15.3139 10653368 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:680
15.3232 10683384 11. include_once('/mnt/project/system/Debug/Toolbar/View/toolbar.tpl.php') /home/vagrant/.composer/vendor/phpunit/php-code-coverage/src/CodeCoverage.php:707
This class represents a single image file and provides many features to work directly with the image itself, whether GD, GD2, or ImageMagic is present, through Handlers. Provides many common solutions to tasks like:
Development Checklist:
The current test case classes has no namespace.
I think it is better they have also namespaces. It avoids class name collisions.
And in my opinion, it is the best that a test case class has the same namespace as the class under test.
In that case, we can write class names in test code with the same style as the class under test.
What do you think?
Now we have only system test, and the tests
folder is like this:
tests/
|--Autoloader/
|--CLI/
...
My question is where do we put application test files?
We are starting to get contributions from the community.
Should we start enforcing signing, eg GPG?
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.