wesleyelliott / kubwa Goto Github PK
View Code? Open in Web Editor NEWAn Annotation based validation library for use with Android's DataBinding library in an MVVM architecture.
An Annotation based validation library for use with Android's DataBinding library in an MVVM architecture.
I am attempting to use this library in a Kotlin project with Gradle version 3.2.1 on Android Studio 3.2.1 Stable. Upon Gradle sync or project build the sync/build fails with the following message: Invalid byte 2 of 4-byte UTF-8 sequence.
Removing implementation 'com.wesleyelliott:kubwa-annotations:1.2.0'
from my build.gradle resolves the issue and allows the sync/build to succeed.
This issue appears to have been resolved by a different library; see https://github.com/evernote/android-state/issues/56
at org.gradle.api.internal.artifacts.transform.UserCodeBackedTransformer.transform(UserCodeBackedTransformer.java:89)
at org.gradle.api.internal.artifacts.transform.ChainedTransformer.transform(ChainedTransformer.java:36)
at org.gradle.api.internal.artifacts.transform.TransformArtifactOperation.run(TransformArtifactOperation.java:41)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.access$900(DefaultBuildOperationExecutor.java:63)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$ParentPreservingQueueWorker.execute(DefaultBuildOperationExecutor.java:378)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runOperation(DefaultBuildOperationQueue.java:230)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.access$600(DefaultBuildOperationQueue.java:172)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.call(DefaultBuildOperationQueue.java:209)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.call(DefaultBuildOperationQueue.java:203)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runBatch(DefaultBuildOperationQueue.java:202)
at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.run(DefaultBuildOperationQueue.java:177)
... 6 more
Caused by: java.lang.RuntimeException: Failed to transform 'C:\Users\Mitch\.gradle\caches\modules-2\files-2.1\com.google.android\android\4.1.1.4\3fb039385e71e9aa2ba547ea9ea8caa34a4ffac7\android-4.1.1.4.jar' using Jetifier. Reason: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.. (Run with --stacktrace for more details.) To disable Jetifier, set android.enableJetifier=false in your gradle.properties file.
at com.android.build.gradle.internal.dependency.JetifyTransform.transform(JetifyTransform.kt:204)
at org.gradle.api.internal.artifacts.transform.TransformArtifactsAction.apply(TransformArtifactsAction.java:44)
at org.gradle.api.internal.artifacts.transform.TransformArtifactsAction.apply(TransformArtifactsAction.java:29)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$TransformAction.execute(DefaultTransformedFileCache.java:224)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$TransformAction.execute(DefaultTransformedFileCache.java:211)
at org.gradle.internal.resource.local.DefaultPathKeyFileStore$1.execute(DefaultPathKeyFileStore.java:111)
at org.gradle.internal.resource.local.DefaultPathKeyFileStore$1.execute(DefaultPathKeyFileStore.java:107)
at org.gradle.internal.resource.local.DefaultPathKeyFileStore.doAdd(DefaultPathKeyFileStore.java:160)
at org.gradle.internal.resource.local.DefaultPathKeyFileStore.add(DefaultPathKeyFileStore.java:107)
at org.gradle.internal.resource.local.DefaultPathKeyFileStore.add(DefaultPathKeyFileStore.java:50)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$1$1.create(DefaultTransformedFileCache.java:143)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$1$1.create(DefaultTransformedFileCache.java:122)
at org.gradle.cache.internal.LockOnDemandCrossProcessCacheAccess.withFileLock(LockOnDemandCrossProcessCacheAccess.java:89)
at org.gradle.cache.internal.DefaultCacheAccess.withFileLock(DefaultCacheAccess.java:193)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.withFileLock(DefaultPersistentDirectoryStore.java:158)
at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.withFileLock(DefaultCacheFactory.java:187)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$1.create(DefaultTransformedFileCache.java:122)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache$1.create(DefaultTransformedFileCache.java:115)
at org.gradle.cache.internal.ProducerGuard$AdaptiveProducerGuard.guardByKey(ProducerGuard.java:97)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache.loadIntoCache(DefaultTransformedFileCache.java:115)
at org.gradle.api.internal.artifacts.transform.DefaultTransformedFileCache.getResult(DefaultTransformedFileCache.java:107)
at org.gradle.api.internal.artifacts.transform.UserCodeBackedTransformer.transform(UserCodeBackedTransformer.java:87)
... 20 more
Caused by: javax.xml.stream.XMLStreamException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:212)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:184)
at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262)
at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
at com.android.tools.build.jetifier.processor.transform.resource.XmlResourcesTransformer.getCharset(XmlResourcesTransformer.kt:82)
at com.android.tools.build.jetifier.processor.transform.resource.XmlResourcesTransformer.runTransform(XmlResourcesTransformer.kt:71)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:328)
at com.android.tools.build.jetifier.processor.archive.ArchiveFile.accept(ArchiveFile.kt:41)
at com.android.tools.build.jetifier.processor.Processor.visit(Processor.kt:316)
at com.android.tools.build.jetifier.processor.archive.Archive.accept(Archive.kt:66)
at com.android.tools.build.jetifier.processor.Processor.transformLibrary(Processor.kt:312)
at com.android.tools.build.jetifier.processor.Processor.transform(Processor.kt:175)
at com.android.build.gradle.internal.dependency.JetifyTransform.transform(JetifyTransform.kt:199)
... 41 more
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:701)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:473)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1895)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1761)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1829)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$XMLDeclDriver.next(XMLDocumentScannerImpl.java:749)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:202)
... 53 more
buildscript {
ext.kotlin_version = '1.3.10'
ext.dagger_version = '2.16'
ext.peko_version = '0.32'
ext.rx_java_version = '2.2.2'
ext.rx_kotlin_version = '2.2.0'
ext.rx_android_version = '2.1.0'
ext.retrofit_version = '2.4.0'
ext.lifecycle_version = '2.0.0'
ext.anko_version = '0.10.7'
ext.psv_version = '1.0.0'
ext.nav_version = '1.0.0-alpha07'
ext.date_time_picker_version = '2.0'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
apply plugin: "kotlin-kapt"
apply plugin: "com.google.gms.google-services"
android {
compileSdkVersion 28
defaultConfig {
applicationId "REDACTED"
minSdkVersion 22
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
dataBinding {
enabled = true
}
}
dependencies {
implementation "androidx.legacy:legacy-support-v4:1.0.0"
testImplementation "junit:junit:4.12"
testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
androidTestImplementation "androidx.test:runner:1.1.0"
androidTestImplementation "androidx.test.espresso:espresso-core:3.1.0"
androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version"
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "androidx.constraintlayout:constraintlayout:2.0.0-alpha2"
implementation "androidx.legacy:legacy-support-core-utils:1.0.0"
implementation "com.google.android.material:material:1.0.0"
implementation "androidx.recyclerview:recyclerview:1.0.0"
implementation "androidx.appcompat:appcompat:1.0.2"
implementation "androidx.preference:preference:1.0.0"
implementation "androidx.core:core-ktx:1.0.1"
implementation "androidx.fragment:fragment-ktx:1.0.0"
implementation "com.google.dagger:dagger:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.markodevcic.peko:peko:$peko_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"
implementation "com.google.android.gms:play-services-maps:16.0.0"
implementation "org.jetbrains.anko:anko-commons:$anko_version"
implementation "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
implementation "com.android.support.constraint:constraint-layout:1.1.3"
implementation "com.paulrybitskyi.persistentsearchview:persistentsearchview:$psv_version"
implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version"
implementation "android.arch.navigation:navigation-ui-ktx:$nav_version"
implementation "com.google.android.gms:play-services-places:16.0.0"
implementation "com.google.firebase:firebase-database:16.0.5"
implementation "com.github.Kunzisoft:Android-SwitchDateTimePicker:$date_time_picker_version"
implementation "com.github.etiennelenhart:eiffel:4.0.0"
implementation 'com.wesleyelliott:kubwa-annotations:1.2.0'
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.wesleyelliott:kubwa-compiler:1.2.0"
}
e.g I have form with few fields as optional. Since rest of the fields are strings but Compulsory. I am trying to put @NotNull annotation for each but I get duplicate annotation now allowed error.
Hi,
When following your instructions and setting i.e.
@Password(errorMessage = R.string.password_error, scheme = PasswordRule.Scheme.ANY)
R.string.password_error results in: Error. Attribute value must be constant
Is there a way how to register new custom rule?
How to set multiple Validation on one View?
< example >
@password(errorMessage = R.string.password_error, scheme = PasswordRule.Scheme.ALPHA_MIXED_CASE)
@NotNull.List({
@NotNull(name = "passwordNotNull", errorMessage = R.string.errortest1),
@NotNull(name = "confirmPasswordNotNull", errorMessage = R.string.errortest2)
})
<EditText
android:id="@+id/join_pw"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/default_40"
android:layout_marginStart="@dimen/default_40"
android:hint="@string/ui_login_psw_hint"
android:inputType="textPassword"
android:text="@{viewModel.userPassword}"
app:error="@{viewModel.passwordErrorMessage}"
app:error="@{viewModel.passwordNotNullMessage}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/join_id" />
Hi, thanks for great library
I have problem with the case First Name and Last Name are individual field and cannot be null.
My ViewModel:
@NotNull(errorMessage = R.string.error_name)
public class UserProfile_ViewModel extends BaseObservable
...
//validator
public String getFirstNameError() {
return validator.getNotNullErrorMessage();
}
public String getLastNameError() {
return validator.getNotNullErrorMessage();
}
Let say, first name is empty but the error message was showed on both fields first name and lastname.
Do you have any ideas for this situation ? Tks
Hi,
for some reason when I add this library to a gradle it fails to find android.R.id.home
. Sounds strange but it is happening only when I add this library. When I remove it, it is working fine.
Any ideas how to solve it?
I am using Kotlin 1.2.10
Gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
def AAVersion = '4.4.0'
def supportVersion = "26.1.0"
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.xxx.xxx"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation "com.android.support:appcompat-v7:${supportVersion}"
implementation "com.android.support:design:${supportVersion}"
implementation 'android.arch.lifecycle:extensions:1.0.0'
// Networking
implementation('com.octo.android.robospice:robospice-retrofit:1.4.14') {
exclude module: "commons-io"
}
implementation 'commons-io:commons-io:2.5'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
// Android Annotations
implementation 'com.android.support:support-v4:26.1.0'
kapt "com.android.databinding:compiler:3.0.1"
kapt "org.androidannotations:androidannotations:$AAVersion"
implementation "org.androidannotations:androidannotations-api:$AAVersion"
// Parceler
implementation 'org.parceler:parceler-api:1.1.7'
kapt 'org.parceler:parceler:1.1.7'
// Animations
implementation 'com.daimajia.androidanimations:library:2.3@aar'
// Image library
implementation 'com.github.bumptech.glide:glide:4.2.0'
kapt 'com.github.bumptech.glide:compiler:4.2.0'
// Walk through
implementation 'com.github.apl-devs:appintro:v4.2.2'
// ZXing reader
implementation 'com.google.zxing:core:3.3.0'
implementation 'com.journeyapps:zxing-android-embedded:3.5.0'
// Skeleton view
implementation 'com.ethanhua:skeleton:1.0.1'
implementation 'io.supercharge:shimmerlayout:1.0.2'
// Validations
implementation 'com.wesleyelliott:kubwa-annotations:1.0.1'
kapt 'com.wesleyelliott:kubwa-compiler:1.0.1'
// Multidex
implementation 'com.android.support:multidex:1.0.1'
}
android.R.id.home usage
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
...
}
}
return super.onOptionsItemSelected(item)
}
Seems unreliable,the validator classes generation is hit and miss.
Once I add the library to the project, it starts sending out unexpected building errors like this ones:
Error:(54, 25) None of the following functions can be called with the arguments supplied:
public final fun removeAccount(p0: Account!, p1: ((AccountManagerFuture<Boolean!>!) -> Unit)!, p2: Handler!): AccountManagerFuture<Boolean!>! defined in android.accounts.AccountManager
public open fun removeAccount(p0: Account!, p1: AccountManagerCallback<Boolean!>!, p2: Handler!): AccountManagerFuture<Boolean!>! defined in android.accounts.AccountManager
Error:(26, 51) Unresolved reference: getDrawable
However, after removing the library they disappear.
Update
Guess it's related to #8
app gradle file
apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.mysampleapp"
minSdkVersion 22
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
kapt {
javacOptions {
// Increase the max count of errors from annotation processors.
// Default is 100.
option("-Xmaxerrs", 500)
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.github.WesleyElliott.Kubwa:kubwa:v2.0.0'
implementation 'com.github.WesleyElliott.Kubwa:kubwa-annotations:v2.0.0'
annotationProcessor 'com.github.WesleyElliott.Kubwa:kubwa-compiler:v2.0.0'
}
Project level gradle file,
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
A sample Observable
class,
public class UserSignupViewModel extends BaseObservable {
@Range(errorMessage=R.string.error_userName,max = 20,min = 5)
private String userName;
@NotNull(errorMessage = R.string.error_FirstName)
String firstName;
@NotNull(errorMessage = R.string.error_LastName)
String lastName;
@Email(errorMessage = R.string.error_emailId)
String emailId;
@Bindable
public String getUserName() {
return userName;
}
public void setUserName(String uname) {
this.userName = uname;
notifyPropertyChanged(BR.userName);
}
@Bindable
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
@Bindable
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
@Bindable
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
notifyPropertyChanged(BR.lastName);
}
}
gradle.properties
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
LoginViewModelValidator validator; // Generated when project is built
The validator is not auto-generating.
When trying to follow the example found this error.
http://stackoverflow.com/questions/41068826/android-data-binding-edittext-seterror
Hi, I'm trying to test this library to use in a new Kotlin project with Android Architecture Components using MVVM and the Android Data binding library.
I have a very simple prototype but the MainViewModelValidator class isn't getting created.
@Email(errorMessage = R.string.validation_emailAddress)
class MainViewModel : ViewModel() {
...
val validator = MainViewModelValidator //Unresolved Reference
}
Gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 27
defaultConfig {
applicationId "pl.pszklarska.livedatabinding"
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation 'android.arch.lifecycle:extensions:1.1.1'
// Kotlin Extensions
implementation 'androidx.core:core-ktx:0.2'
kapt 'com.android.databinding:compiler:3.2.0-alpha08'
kapt 'android.arch.lifecycle:compiler:1.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
//Validation
implementation 'com.wesleyelliott:kubwa-annotations:1.1.1'
annotationProcessor 'com.wesleyelliott:kubwa-compiler:1.1.1'
}
Are you able to offer any assistance on how to overcome this issue?
Thanks in advance
I like a lot the idea of this library, but what if I have to add a custom validation?
I am getting this error: Error:Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider com.wesleyelliott.kubwa.KubwaCompiler could not be instantiated: java.lang.NoClassDefFoundError: com/wesleyelliott/kubwa/rule/Rule
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.