Git Product home page Git Product logo

pg-libphonenumber's Introduction

pg_libphonenumber

A (partially implemented!) PostgreSQL extension that provides access to Google's libphonenumber

Project status

This extension is in an alpha state. It's not complete or tested enough for critical production deployments, but with a little help, we should be able to get it there.

Synopsis

CREATE EXTENSION pg_libphonenumber;
SELECT parse_packed_phone_number('03 7010 1234', 'AU');
SELECT parse_packed_phone_number('2819010011', 'US');

CREATE TABLE foo ( ph packed_phone_number );

Installation

Debian/Ubuntu

First you'll need to install libphonenumber-dev and the corresponding postgresql-server-dev package.

sudo apt-get update && sudo apt-get install \
    build-essential \
    postgresql-server-dev-9.6 \
    libphonenumber-dev

Then clone this repository and build.

git clone https://github.com/blm768/pg-libphonenumber
cd pg-libphonenumber
make
sudo make install

Running tests

For convenience, we provide a Docker image that sets up a test environment. Run the script ./run-tests.sh to build and run the image.

pg-libphonenumber's People

Contributors

blm768 avatar cbcoutinho avatar evancarroll 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

Watchers

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

pg-libphonenumber's Issues

Collation

We need to define a sane collation order for ShortPhoneNumber objects. Right now, we're just ordering by the packed binary data, but that won't always match the natural collation order of phone numbers.

Still being developed?

Active or dead? This is a great idea. Any progress on this? Going to move it out of Alpha?

New Project Idea

Hi @blm768, just wondering are you available to work on a new postgresql extension?

If yes, do provide me your email address. Thanks.

Solidify use cases

The original use case for this project involved improving type safety of phone number storage and making it more compact. With the realization that a fixed-size format was inadequate, development has moved toward a new variable-length PhoneNumber type, which, although more compact than raw strings, doesn't provide major space savings. On top of that, I realized that applications which store phone numbers in a database tend to do their own parsing and validation on the front end, which somewhat reduces the impact of the type safety advantanges.

At some point, the advantages of having a dedicated PhoneNumber type would need to outweigh the costs (i.e. potential for instability, administrative overhead for installation and maintenance, etc.) for this library to see meaningful use.

With all that being said, what additional use cases exist for libphonenumber bindings in PostgreSQL? There's likely something I'm not thinking of.

Compile errors, namely about 'int64' being ambiguous

Here is the result of a compile, on macOS:

pg-libphonenumber$ make
c++  -fPIC -std=gnu++14 -Isrc/ -I/usr/include -Wall -Wextra -O3 -I. -I./ -I/usr/local/Cellar/postgresql/9.6.1/include/server -I/usr/local/Cellar/postgresql/9.6.1/include/internal -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2   -c -o src/error_handling.o src/error_handling.cpp
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:3:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:29:
/usr/local/include/phonenumbers/base/memory/scoped_ptr.h:36:65: warning: unused parameter 'other' [-Wunused-parameter]
  template <typename U> DefaultDeleter(const DefaultDeleter<U>& other) {
                                                                ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:3:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
/usr/local/include/google/protobuf/arena.h:856:16: warning: unused parameter 'value' [-Wunused-parameter]
      const T* value, google::protobuf::internal::false_type) {
               ^
In file included from src/error_handling.cpp:12:
src/short_phone_number.h:126:44: warning: static_assert with no message is a C++1z extension [-Wc++1z-extensions]
static_assert(sizeof(ShortPhoneNumber) == 8);
                                           ^
                                           , ""
3 warnings generated.
c++  -fPIC -std=gnu++14 -Isrc/ -I/usr/include -Wall -Wextra -O3 -I. -I./ -I/usr/local/Cellar/postgresql/9.6.1/include/server -I/usr/local/Cellar/postgresql/9.6.1/include/internal -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2   -c -o src/pg_libphonenumber.o src/pg_libphonenumber.cpp
In file included from src/pg_libphonenumber.cpp:4:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:29:
/usr/local/include/phonenumbers/base/memory/scoped_ptr.h:36:65: warning: unused parameter 'other' [-Wunused-parameter]
  template <typename U> DefaultDeleter(const DefaultDeleter<U>& other) {
                                                                ^
In file included from src/pg_libphonenumber.cpp:4:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
/usr/local/include/google/protobuf/arena.h:856:16: warning: unused parameter 'value' [-Wunused-parameter]
      const T* value, google::protobuf::internal::false_type) {
               ^
In file included from src/pg_libphonenumber.cpp:13:
src/short_phone_number.h:126:44: warning: static_assert with no message is a C++1z extension [-Wc++1z-extensions]
static_assert(sizeof(ShortPhoneNumber) == 8);
                                           ^
                                           , ""
src/pg_libphonenumber.cpp:277:13: error: reference to 'int64' is ambiguous
            int64 compared = number1->compare_fast(*number2);
            ^
/usr/local/Cellar/postgresql/9.6.1/include/server/c.h:283:18: note: candidate found by name lookup is 'int64'
typedef long int int64;
                 ^
/usr/local/include/phonenumbers/base/basictypes.h:27:17: note: candidate found by name lookup is 'i18n::phonenumbers::int64'
typedef int64_t int64;
                ^
src/pg_libphonenumber.cpp:279:34: error: reference to 'int64' is ambiguous
            PG_RETURN_INT32(clip<int64>(compared, -1, 1));
                                 ^
/usr/local/Cellar/postgresql/9.6.1/include/server/c.h:283:18: note: candidate found by name lookup is 'int64'
typedef long int int64;
                 ^
/usr/local/include/phonenumbers/base/basictypes.h:27:17: note: candidate found by name lookup is 'i18n::phonenumbers::int64'
typedef int64_t int64;
                ^
src/pg_libphonenumber.cpp:279:34: error: reference to 'int64' is ambiguous
            PG_RETURN_INT32(clip<int64>(compared, -1, 1));
                                 ^
/usr/local/Cellar/postgresql/9.6.1/include/server/c.h:283:18: note: candidate found by name lookup is 'int64'
typedef long int int64;
                 ^
/usr/local/include/phonenumbers/base/basictypes.h:27:17: note: candidate found by name lookup is 'i18n::phonenumbers::int64'
typedef int64_t int64;
                ^
src/pg_libphonenumber.cpp:279:41: error: use of undeclared identifier 'compared'
            PG_RETURN_INT32(clip<int64>(compared, -1, 1));
                                        ^
3 warnings and 4 errors generated.
make: *** [src/pg_libphonenumber.o] Error 1

I know next to nothing about C++ and building PG extensions, so I won't be of much help here, but I hope this helps.

Special characters

We don't currently have a good way of encoding special characters (i.e. * and #) in a ShortPhoneNumber. We'll probably need that eventually.

Unable to Install/Compile

Following the instructions, I get the following error:

sudo make install
[sudo] password for dude: 
/bin/mkdir -p '/usr/lib/postgresql/11/lib'
/bin/mkdir -p '/usr/share/postgresql/11/extension'
/bin/mkdir -p '/usr/share/postgresql/11/extension'
/usr/bin/install -c -m 755  pg_libphonenumber.so '/usr/lib/postgresql/11/lib/pg_libphonenumber.so'
/usr/bin/install -c -m 644 .//pg_libphonenumber.control '/usr/share/postgresql/11/extension/'
/usr/bin/install -c -m 644 .//sql/pg_libphonenumber--*.sql  '/usr/share/postgresql/11/extension/'
/bin/mkdir -p '/usr/lib/postgresql/11/lib/bitcode/pg_libphonenumber'
/bin/mkdir -p '/usr/lib/postgresql/11/lib/bitcode'/pg_libphonenumber/src/
/usr/bin/install -c -m 644 src/error_handling.bc '/usr/lib/postgresql/11/lib/bitcode'/pg_libphonenumber/src/
/usr/bin/install -c -m 644 src/pg_libphonenumber.bc '/usr/lib/postgresql/11/lib/bitcode'/pg_libphonenumber/src/
/usr/bin/install -c -m 644 src/packed_phone_number.bc '/usr/lib/postgresql/11/lib/bitcode'/pg_libphonenumber/src/
cd '/usr/lib/postgresql/11/lib/bitcode' && /usr/lib/llvm-6.0/bin/llvm-lto -thinlto -thinlto-action=thinlink -o pg_libphonenumber.index.bc pg_libphonenumber/src/error_handling.bc pg_libphonenumber/src/pg_libphonenumber.bc pg_libphonenumber/src/packed_phone_number.bc
error: can't create module summary index for buffer: Expected a single module
LLVM ERROR: ThinLink didn't create an index
/usr/lib/postgresql/11/lib/pgxs/src/makefiles/pgxs.mk:229: recipe for target 'install' failed
make: *** [install] Error 1

I am using postgres 11 so that could be the issue? Is there a way to support 11 or is 9.4 the only supported version? Searching online, I find this on a different project which leads to this snippet but copying that into the Makefile doesn't help. I don't know enough to understand the messages.

Compile failure related to cmath

I was able to build this project in the past, and now I can't. I'm not sure if the error is caused by changes in the project, or changes in my development environment.

traceback for first problem
$ make
clang++ -Wall -Wpointer-arith -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2  -fPIC -std=c++14 -Isrc/ -I/usr/include -Wall -Wextra -O3 -I. -I./ -I/usr/local/include/postgresql/server -I/usr/local/include/postgresql/internal -I/usr/local/Cellar/icu4c/64.2/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -I/usr/local/opt/[email protected]/include -I/usr/local/opt/readline/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/libxml2   -c -o src/error_handling.o src/error_handling.cpp
In file included from src/error_handling.cpp:1:
src/error_handling.h:5:10: fatal error: 'phonenumbers/phonenumberutil.h' file
      not found
#include "phonenumbers/phonenumberutil.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [src/error_handling.o] Error 1

I was able to work around that by adding /usr/local/include to the list of include paths for C++ -- I installed libphonenumber via Homebrew, and Homebrew keeps everything under /usr/local.

After I fixed that, I ran into a different issue:

traceback for second issue
$ make
clang++ -Wall -Wpointer-arith -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2  -fPIC -std=c++14 -Isrc/ -I/usr/include -I/usr/local/include -Wall -Wextra -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -O3 -I. -I./ -I/usr/local/include/postgresql/server -I/usr/local/include/postgresql/internal -I/usr/local/Cellar/icu4c/64.2/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -I/usr/local/opt/[email protected]/include -I/usr/local/opt/readline/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/libxml2   -c -o src/error_handling.o src/error_handling.cpp
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:29:
/usr/local/include/phonenumbers/base/memory/scoped_ptr.h:36:65: warning: unused
      parameter 'other' [-Wunused-parameter]
  template  DefaultDeleter(const DefaultDeleter& other) {
                                                                ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:30:
In file included from /usr/local/include/phonenumbers/base/memory/singleton.h:91:
In file included from /usr/local/include/phonenumbers/base/memory/singleton_posix.h:18:
/usr/include/pthread.h:331:6: warning: macro expansion producing 'defined' has
      undefined behavior [-Wexpansion-to-defined]
#if !_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT
     ^
/usr/include/pthread.h:200:2: note: expanded from macro
      '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
        defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREA...
        ^
/usr/include/pthread.h:331:6: warning: macro expansion producing 'defined' has
      undefined behavior [-Wexpansion-to-defined]
/usr/include/pthread.h:200:34: note: expanded from macro
      '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
        defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREA...
                                        ^
/usr/include/pthread.h:540:6: warning: macro expansion producing 'defined' has
      undefined behavior [-Wexpansion-to-defined]
#if !_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT
     ^
/usr/include/pthread.h:200:2: note: expanded from macro
      '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
        defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREA...
        ^
/usr/include/pthread.h:540:6: warning: macro expansion producing 'defined' has
      undefined behavior [-Wexpansion-to-defined]
/usr/include/pthread.h:200:34: note: expanded from macro
      '_PTHREAD_SWIFT_IMPORTER_NULLABILITY_COMPAT'
        defined(SWIFT_CLASS_EXTRA) && (!defined(SWIFT_SDK_OVERLAY_PTHREA...
                                        ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
In file included from /usr/local/include/google/protobuf/io/coded_stream.h:143:
In file included from /usr/local/include/google/protobuf/stubs/strutil.h:39:
In file included from /usr/local/include/google/protobuf/stubs/stringpiece.h:152:
In file included from /usr/local/include/google/protobuf/stubs/hash.h:39:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/unordered_map:408:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__hash_table:19:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314:9: error: 
      no member named 'signbit' in the global namespace
using ::signbit;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:315:9: error: 
      no member named 'fpclassify' in the global namespace
using ::fpclassify;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:316:9: error: 
      no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
      ~~^
/usr/include/math.h:749:12: note: 'finite' declared here
extern int finite(double)
           ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
In file included from /usr/local/include/google/protobuf/io/coded_stream.h:143:
In file included from /usr/local/include/google/protobuf/stubs/strutil.h:39:
In file included from /usr/local/include/google/protobuf/stubs/stringpiece.h:152:
In file included from /usr/local/include/google/protobuf/stubs/hash.h:39:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/unordered_map:408:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__hash_table:19:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:317:9: error: 
      no member named 'isinf' in the global namespace
using ::isinf;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:318:9: error: 
      no member named 'isnan' in the global namespace
using ::isnan;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:319:9: error: 
      no member named 'isnormal' in the global namespace
using ::isnormal;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:320:7: error: 
      no member named 'isgreater' in the global namespace; did you mean
      '::std::greater'?
using ::isgreater;
      ^~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional:728:29: note: 
      '::std::greater' declared here
struct _LIBCPP_TEMPLATE_VIS greater : binary_function<_Tp, _Tp, bool>
                            ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
In file included from /usr/local/include/google/protobuf/io/coded_stream.h:143:
In file included from /usr/local/include/google/protobuf/stubs/strutil.h:39:
In file included from /usr/local/include/google/protobuf/stubs/stringpiece.h:152:
In file included from /usr/local/include/google/protobuf/stubs/hash.h:39:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/unordered_map:408:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__hash_table:19:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:321:7: error: 
      no member named 'isgreaterequal' in the global namespace; did you mean
      '::std::greater_equal'?
using ::isgreaterequal;
      ^~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional:757:29: note: 
      '::std::greater_equal' declared here
struct _LIBCPP_TEMPLATE_VIS greater_equal : binary_function<_Tp, _Tp, bool>
                            ^
In file included from src/error_handling.cpp:1:
In file included from src/error_handling.h:5:
In file included from /usr/local/include/phonenumbers/phonenumberutil.h:31:
In file included from /usr/local/include/phonenumbers/phonenumber.pb.h:23:
In file included from /usr/local/include/google/protobuf/io/coded_stream.h:143:
In file included from /usr/local/include/google/protobuf/stubs/strutil.h:39:
In file included from /usr/local/include/google/protobuf/stubs/stringpiece.h:152:
In file included from /usr/local/include/google/protobuf/stubs/hash.h:39:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/unordered_map:408:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__hash_table:19:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:322:9: error: 
      no member named 'isless' in the global namespace
using ::isless;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:323:9: error: 
      no member named 'islessequal' in the global namespace
using ::islessequal;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:324:9: error: 
      no member named 'islessgreater' in the global namespace
using ::islessgreater;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:325:9: error: 
      no member named 'isunordered' in the global namespace
using ::isunordered;
      ~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:326:9: error: 
      no member named 'isunordered' in the global namespace
using ::isunordered;
      ~~^
5 warnings and 13 errors generated.
make: *** [src/error_handling.o] Error 1

I have not found a workaround for this issue. It appears that the latest development toolchain on macOS has problems with the <cmath> headers -- I think this is the same problem.

I'm running macOS 10.14.6, Xcode 11.2.1. Not sure what other debugging information would be useful.

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.