python-dirbtuves / akl.lt Goto Github PK
View Code? Open in Web Editor NEWAKL web site
License: GNU Affero General Public License v3.0
AKL web site
License: GNU Affero General Public License v3.0
I followed instructions on README.rst for Ubuntu environment and got this traceback, when ran tests:
`````` ......FE......FF...F..............SFF..
======================================================================```
```ERROR: test_command (akllt.dataimport.tests.test_importzope.ImportZopeCommandTests)```
```----------------------------------------------------------------------```
```Traceback (most recent call last):```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/tests/test_importzope.py", line 14, in test_command```
``` call_command('akllt_importzope', fixture('whole_export'), verbosity=0)```
``` File "/home/strazdas/.buildout/eggs/Django-1.7-py3.4.egg/django/core/management/init.py", line 115, in call_command```
``` return klass.execute(*args, **defaults)```
``` File "/home/strazdas/.buildout/eggs/Django-1.7-py3.4.egg/django/core/management/base.py", line 338, in execute```
``` output = self.handle(*args, **options)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/management/commands/akllt_importzope.py", line 94, in handle```
``` total = sum(1 for _ in generator)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/management/commands/akllt_importzope.py", line 94, in ```
``` total = sum(1 for _ in generator)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/convertlinks.py", line 106, in convert_links```
``` convert_page_link(page)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/convertlinks.py", line 99, in convert_page_link```
``` page.body = A_TAG_RE.sub(replace_links, page.body)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/convertlinks.py", line 95, in replace_links```
``` return format_wagtail_tag(page, link)```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/convertlinks.py", line 80, in format_wagtail_tag```
``` ref_page = Page.objects.get(url_path=url_path)```
``` File "/home/strazdas/.buildout/eggs/Django-1.7-py3.4.egg/django/db/models/manager.py", line 92, in manager_method```
``` return getattr(self.get_queryset(), name)(*args, **kwargs)```
``` File "/home/strazdas/.buildout/eggs/Django-1.7-py3.4.egg/django/db/models/query.py", line 357, in get```
``` self.model._meta.object_name)```
```nose.proxy.DoesNotExist: Page matching query does not exist.```
```-------------------- >> begin captured stdout << ---------------------```
```Successfully imported 16 and updated 0 items. Total 16 items processed.```
``` ```
```--------------------- >> end captured stdout << ----------------------```
``` ```
```======================================================================```
```FAIL: test_get_total (akllt.dataimport.tests.test_importmanager.ImportManagerTests)```
```----------------------------------------------------------------------```
```Traceback (most recent call last):```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/tests/test_importmanager.py", line 18, in test_get_total```
``` self.assertEqual(manager.get_total(), 14)```
```AssertionError: 16 != 14```
``` ```
```======================================================================```
```FAIL: test_import (akllt.dataimport.tests.test_pages_import.PagesImporterTests)```
```----------------------------------------------------------------------```
```Traceback (most recent call last):```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/tests/test_pages_import.py", line 85, in test_import```
``` ('/home/ak/sekme/', 'Sėkmės istorijos'),```
```AssertionError: Lists differ: [('/h[88 chars]e/ak/atviri_standartai/atviri_standartai/', 'A[714 chars]os')] != [('/h[88 chars]e/ak/dokumentacija/', 'Dokumentacija'), ('/hom[556 chars]os')]```
``` ```
```First differing element 2:```
```('/home/ak/atviri_standartai/atviri_standartai/', 'Atviri standartai, protokolai, formatai. Kodėl Lietuvai jų reikia?')```
```('/home/ak/dokumentacija/', 'Dokumentacija')```
``` ```
```First list contains 2 additional elements.```
```First extra element 14:```
```('/home/ak/osd/', 'Atvirojo kodo apibrėžimas')```
``` ```
```Diff is 910 characters long. Set self.maxDiff to None to see it.```
``` ```
```======================================================================```
```FAIL: test_iterate_paths (akllt.dataimport.tests.test_pages_import.PagesImporterTests)```
```----------------------------------------------------------------------```
```Traceback (most recent call last):```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/dataimport/tests/test_pages_import.py", line 52, in test_iterate_paths```
``` 'ak/sekme.html',```
```AssertionError: Lists differ: ['ak/[24 chars] 'ak/atviri_standartai/atviri_standartai.zpt',[268 chars]tml'] != ['ak/[24 chars] 'ak/dokumentacija.html', 'ak/floss.html', 'ak[205 chars]tml']```
``` ```
```First differing element 1:```
```ak/atviri_standartai/atviri_standartai.zpt```
```ak/dokumentacija.html```
``` ```
```First list contains 2 additional elements.```
```First extra element 12:```
```ak/osd.html```
``` ```
``` ['ak/atviri_standartai.html',```
```- 'ak/atviri_standartai/atviri_standartai.zpt',```
``` 'ak/dokumentacija.html',```
``` 'ak/floss.html',```
``` 'ak/free-sw.html',```
``` 'ak/knygos.html',```
```- 'ak/laisve.zpt',```
``` 'ak/licencijos/apie.html',```
``` 'ak/licencijos/copyleft.html',```
``` 'ak/licencijos/gpl.html',```
``` 'ak/licencijos/kategorijos.html',```
``` 'ak/licencijos/lgpl.html',```
``` 'ak/osd.html',```
``` 'ak/sekme.html']```
``` ```
```======================================================================```
```FAIL: test_menu_tree (akllt.website.tests.test_navigation.ManuTreeTests)```
```----------------------------------------------------------------------```
```Traceback (most recent call last):```
``` File "/home/strazdas/Desktop/akl_tmp/akl.lt/akllt/website/tests/test_navigation.py", line 75, in test_menu_tree```
``` '',```
```AssertionError: Lists differ: ['<ul[52 chars], 'p2', '', '
Iš naujienų puslapio paspaudus nuorodą „Pasiūlyk naujieną!“, turi atsidaryti naujienos forma. Pasiūlyta naujiena turi būti įtraukta į laukiančių peržiūros naujienų sąrašą ir visiems naujienų moderatoriams turi būti išsiųstas el. laiškas su informacija, kad yra naujienų laukiančių patvirtinimo.
Naujienas gali siūlyti tik registruoti naudotojai.
Dabar importavimo metu, kuriant kategorijas nepaimama meta informacija, kuriant panaudojamas tik slug. Kategorijoms turėtų būti imama visa meta informacija, kaip ir kitiems puslapiams.
Importuojant duomenis reikia pakeisti reliatyvias nuorodas į wagtail nuorodas.
Pavyzdžiui http://127.0.0.1:8000/ak/dokumentacija/ puslapyje yra daug ?doc=jabber.html
ir panašių nuorodų. Jov siso turėtų būti pakeistos į /ak/dokumentacija/jabber/
arba panaudoti Wagtail URL žymes, kažkur mačiau, kad kažkas tokio yra.
Programų kataloge, apsilankius katalogo adresu, turi būti rodomas sąrašas programų su nuorodomis į tų programų puslapius. Programų kataloge meniu neturi rodyti pačių programų.
Žodžiu tam reikalui reikia padaryti specialų importerį ir specialias Wagtai Page klases.
Šiuo metu katalogų medis rodo tik vieno lygio katalogus ir nėra galimybės grįžti atgal.
Reikia tai pataisyti arba rodant du katalogų lygius arba rodant visą medį, arba patikrinant esamas katalogas turi puslapių ir jei neturi, tada rodyti tėvinį katalogą, kuris turi bent vieną puslapį.
Paskutinis variantas tikriausiai būtų teisingiausias.
Pavyzdys, kur tokia klaida pasireiškia:
http://127.0.0.1:8000/apie/ - paspaudus ant bet kurio puslapio, dingsta meniu.
Puslapyje http://127.0.0.1:8000/accounts/login/ Launchpad OpenID mygtukas, su paruoštu adreso fragmentu. Paspaudus Sign In adresas turi būti sulipdomas JavaScript pagalba ir formai siunčiamas pilnas adresas.
Tituliniame lape, naujienų sąrašo apačioje turi būti nuoroda „Visos naujienas“, ši nuoroda veda į naujienų archyve.
Naujienų archyve šoninėje juostoje turi būti rodomi metų ir mėnesių medis. Mėnesiai rodomi tik pasirinktų metų. Archyve visą laiką rodomos tik pasirinkto vieno mėnesio naujienų sąrašas.
Importuojant puslapius, taip pat reikia importuoti paveiksliukus ir kitus failus. Po importavimo, puslapio turinys turi būti sutvarkytos, kad importuotų paveiksliukų ir failų nuorodos veiktų.
$ bin/django makemigrations
Migrations for 'socialaccount':
0002_auto_20150223_1800.py:
- Alter field extra_data on socialaccount
- Alter field provider on socialaccount
- Alter field provider on socialapp
Another project used same login page code and improved it. These improvements has to be integrated back into akl.lt project.
You can see how improved login page looks, here: http://ad.sirex.lt/accounts/login/
There where two changes related to login page:
sirex/atviriduomenys.lt@96e5a53
sirex/atviriduomenys.lt@082e92a
Sukarpytą ir sutvarkytą dizaino kodą galima rasti http://bazaar.launchpad.net/~sirex/ubuntu.lt/django/files adresu.
Situacija yra tokia, kad bandant pasiekti /admin/
, kai esi prisijungęs naudotojo teisėmis neturinčio wagtailadmin.access_admin
teisės, naudotojas peradresuojamas į settings.LOGIN_URL
, o settings.LOGIN_URL
rodo į allauth.account.views.LoginView
, kuris per allauth.account.views.RedirectAuthenticatedUserMixin
mixiną automatiškai peradresuoja atgal į request.GET.next
ir taip sukuriamas begalinis ciklas.
Manau teisingiausias būdas, būtų taisyti allauth:
pennersr/django-allauth#686 (comment)
Tačiau, jei allauth nesutiks priimti tokio pataisymo, tada settings.LOGIN_URL
turi rodyti į mūsų view klasę, kuri pašalina allauth.account.views.RedirectAuthenticatedUserMixin
peradresavimą.
Seni naujienų adresai atrodo taip:
http://www.akl.lt/naujienos/?id=naujiena_1047
Reikia padaryti nukreipimą į /naujienos/naujiena_1047
.
Vienas iš galimų variantų, kaip tai padaryti - middleware panaudojimas.
Šiuo metu yra toks puslapis: http://127.0.0.1:9001/apie/naryste/
Jis yra statinis. Reikėtų padaryti patogią formą, kurią užpildžius, būtų sukurta užklausa tapti AKL nariu.
Išsiaiškinau, kad labai lėtas testų vykdymas susijęs su naujuoju Django 1.7 migracijų mechanizmu. Kiekvieną kartą leidžiant testus Django paleidžia visas migracijas, todėl tai suvalgo apie 10 sekundžių laiko.
Plačiau apie tai: https://code.djangoproject.com/ticket/23745#comment:14
Reikėtų perkelti visus wiki.akl.lt duomenis į pagrindinę duomenų bazę.
Dabartiniame akl.lt svetainės dizaine paragrafai neatskirti tarpais, taip pat manau, kad teksto šriftas per daug mažas (labai mažas šriftas būdingas korporatyviniam svetainių stiliui).
Palyginimui:
Turi būti galimybė per administravimo aplinką įvesti įmones teikiančias atviro kodo paslaugas. Įmonių sąrašas turi būti atvaizduojamas adresu /imones/
, papildomai reikia padaryti skydelį šoninėje juostoje, kuris būtų rodomas pirmame puslapyje.
Padaryti naujienų RSS.
find src -type f -iname '*.py[co]' -delete
bin/nodeenv --node=0.11.13 --prebuilt -p --requirements=node-requirements.txt
* Install node.js (0.11.13) ... done.
* Appending nodeenv settings to /home/arnas/Skleps/akl.lt/bin/activate
* Install node.js packages ... Traceback (most recent call last):
File "bin/nodeenv", line 9, in <module>
load_entry_point('nodeenv==0.11.0', 'console_scripts', 'nodeenv')()
File "/home/arnas/Skleps/akl.lt/lib/python2.7/site-packages/nodeenv.py", line 765, in main
create_environment(env_dir, opt)
File "/home/arnas/Skleps/akl.lt/lib/python2.7/site-packages/nodeenv.py", line 686, in create_environment
install_packages(env_dir, opt)
File "/home/arnas/Skleps/akl.lt/lib/python2.7/site-packages/nodeenv.py", line 608, in install_packages
cmd % {"pack": package}], show_stdout=opt.verbose, in_shell=True)
File "/home/arnas/Skleps/akl.lt/lib/python2.7/site-packages/nodeenv.py", line 420, in callit
% (cmd_desc, proc.returncode))
OSError: Command ". /home/arnas/Skleps...stall -g [email protected]" failed with error code 243
Makefile:27: recipe for target 'bin/node' failed
make: *** [bin/node] Error 1
Sena akl.lt svetainė turi puslapių katalogus, kiekviename kataloge yra puslapių sąrašas. Jei atidaromas puslapių katalogas, tada tuo adresu rodomas pirmas tos kategorijos puslapis.
Dabar, atidarius katalogą, nerodoma niekas.
Pavyzdys: http://127.0.0.1:8000/ak/
Iki šiol importavimo skriptai buvo testuoti tik ant SQLite, tačiau pabandžius tai padaryti su PorstgreSQL išlindo viena klaida dėl per per didelės eilutės, kuri netelpa į lauko ribas.
Reikia pataisyti šią klaidą.
Šiuo metu šoninis meniu rodomas tik aukščiausio lygio puslapių. Atidarius gilesnį puslapių katalogą, vis tiek rodomas aukščiausio lygio meniu, pavyzdžiui: http://127.0.0.1:8000/ak/licencijos/
Reikia padaryti, kad būtų rodomi ir vidinių puslapių meniu.
Tačiau, jei kategorijos puslapis pats turi turinį, tada reikia rodyti to puslapio turinį.
akllt/news/urls.py ln7, ln14
Functions point to files that do not exist. Figure out if they are missing or entire news directory should be removed.
Wagtail paveiksliukai turi lphoto
ir rphoto
CSS klases, kurios šiuo metu neturi jokio stiliaus. Reikėtų aprašyti stilius, kad paveiksliukai būtų pozicionuojami teisingai.
Pavyzdys, kur tai pasireiškia: http://127.0.0.1:8000/apie/apie/
Šioje užduotyje surašyti bendri viso akl.lt projekto reikalavimai. Ši užduotis
bus baigta, kai visos akl.lt projekto funkcijos bus pabaigtos.
Renginių turinio tipas. Turi būti galimybė užregistruoti renginį, padaryti
galimybę registruotis renginio dalyviams. Turi būti galimybė visiems
užsiregistravusiems nusiųsti laišką.
Naudojantis renginių dalimi, gali būti organizuojami ir AKL narių
susitikimai, sekamas, narių aktyvumas, dalyvaujant susitikimuose.
Apklausų turinio tipas. Galimybė organizuoti apklausas, pateikiant kelis
galimus variantus. Apklausose, naudotojai taip pat turėtų galėti pateikti ir
savo variantus.
Perkeliant seną turinį, turi būti paliekamos galioti senos nuorodos,
peradresuojant į naujus adresus.
Svetainėje turėtų būti keturios naudotojų rolės: administratoriai, akl nariai,
registruoti naudotojai ir neregistruoti naudotojai.
Administratoriai gali daryti viską.
Neregistruoti naudotojai gali pasiūlyti turinį, tačiau visas jų pasiūlytas
turinys turi būti patvirtintas.
Ką gali daryti registruoti naudotojai apsprendžiama pagal jų aktyvumą. Kuo
aktyvesnis naudotojas, tuo daugiau teisių jis įgauna. Mažiausiai teisių
turintis naudotojas turi tiek pat teisių, kiek ir neregistruotas, tik kai
kuriems turinio tipams, tokiems, kaip komentarų rašymas, patvirtinimo
nebereikia. Kuo aktyviau registruotas naudotojas naudojasi svetaine, tuo
daugiau teisių jis įgauna.
AKL nariai turi tas pačias teisias, kaip ir registruoti naudotojai, tik jiems
išimties teise, be patvirtinimo leidžiama kurti naujienas.
Svetainės naudotojai gal registruotis per OAuth ir OpenID protokolus.
## Projektų katalogasProgramų kataloge tiesiog turėtų būti galimybė nurodyti programos
paveiksliukus, aprašymą, programos logotipą ir t.t.
Dar kilo tokia mintis, kadangi naujo dizaino viršutinė dalis sudaryta iš
logotipų, tai tą paveiksliuką galime generuoti dinamiškai iš programų kataloge
pateiktų logotipų, sugrupuojant juos pagal populiarumą.
Kadangi programų katalogas, dalyvauja daugelyje kitų vietų, tikriausiai šią
vietą galima būtų apibendrinti, kaip domėjimosi sritis. O pats programų
katalogas būtų specializuota domėjimosi sritis.
Galimybė atskirti projektų katalogo dalį į atskirą puslapį, su atskiru
dizainu. Nedidelėms bendruomenėms, pavyzdžiui, Gimp naudotojams, Python
programuotojams, Ubuntu naudotojams ir pan. atsiranda poreikis, turėti savo
nedidelį bendruomenės puslapį.
Jei kurios nors atviro kodo programos bendruomenė pakankamai sustiprėja, tai
jos forumo, galerijos, konsultantų ir kitas dalis turi būti galimybė atskirti
į atskirą puslapį, su atskiru dizainu, domenu ir t.t.
Techniškai, tai gali veikti viename serveryje ant tos pačios kodo bazės.
Panaudojant Django sites karkasą, galima nesunkiai vieno projekto ribose,
organizuoti kelias atskiras svetaines.
Tam, kiekvienas turinio tipas, turi priklausyti tam tikrai svetainei. akl.lt
rodytų visų svetainių turinį, tačiau, atsiskyrusi svetainė, galėtų tą turinį
organizuotis savaip. Tai reiškia, kad kiekviena svetainė, turi turėti
galimybę naudoti savo šablonus.
Atviro kodo konsultantų katalogas. Turi būti susietas su projektų katalogu, kur
prie kiekvieno projekto galėtų registruotis konsultantai galintys mokamai
arba nemokamai įdiegti Ubuntu ar dar ką nors. Konsultantų katalogas turi turėti
žemėlapį, kuriame matosi, kokioje vietoje atviro kodo konsultantai gali padėti.
Galerija gali būti prijungta prie visų turinio tipų, prie naujienų, renginių,
projektų ir t.t.
Programų ekrano vaizdų (screenshots) galerija turi integruotis prie projektų
katalogo. Pavyzdžiui, Ubuntu, Debian, ArchLinux ir kitų projektų dalyje, turėtų
būti nuoroda į ekrano vaizdų skiltį. Ekrano vaizdų skiltyje būtų atvaizduojami
naudotojų pateikti ekrano vaizdai, organizuoti, pagal programos versijas. Ši
vieta yra gan aktuali, bent jau ubuntu.lt forume, ekrano vaizdų
tema yra visų laikų pati
populiariausia.
Komentavimo sistema prilygstanti forumui. Turėtų būti galimybė komentuoti visus
turinio tipus. Projektų kataloge, pavyzdžiui po Ubuntu skiltimi, komentarai
galėtų veikti kaip forumas. Gal būt, kada nors ateityje, ubuntu.lt forumas, bus
perkeltas į šią komentarų skiltį.
Komentavimo sistemoje, turi būti galimybė sukurti temas ir organizuoti
diskusiją temoje. Moderatoriai turi turėti galimybę perkelti ir redaguoti
temas. Žodžiu minimalistinis forumas.
Komentaruose turi būti galimybė pateikti nuorodas, paveiksliukus, įterpiamus
vaizdo įrašus (Yutube, Vimeo), kodo pavyzdžius su sintaksės paspalvinimu.
Turi būti galimybė reitinguoti komentarus.
Komentarai gali būti kaip klausimas, tada aukščiausią reitingą turintys
komentarai visada bus rodomi viršuje, arba komentarai gali būti diskusijos
pavidalo, kur vis komentarai būtų rodomi chronologine tvarka.
AKL narių dalis. Šioje dalyje turi būti galimybė matyti AKL narių sąrašą, su
AKL narių avataro paveiksliukais. Turi būti galimybė visiems AKL nariams
nusiųsti pranešimą, apie nesumokėtą nario mokestį. Kiekvienas AKL narys gali
atsižymėti, kad jau yra sumokėjęs nario mokestį.
Tikriausiai būtu įdomu žinoti ir atvirai pateikti esamą AKL biudžetą. Tai
padėtų paprasčiau apsispręsti, kur panaudoti surinktus pinigus. Žodžių,
atvira buhalterija, kurioje rodoma iš kur gauti pinigai ir kur išleisti.
Kol kas ši užduotis neturi aprašymo, kadangi duomenų perkėlimas nėra trivialus darbas.
Django 1.8 jau išleistas, reikėtų atnaujinti ir akl.lt projektą.
https://www.djangoproject.com/weblog/2015/apr/01/release-18-final/
Should implement Feed.item_pubdate(self, item)
method.
This task is blocked by #48.
Savanoriai, kurie sutinka padėti įdiegti ar paaiškinti kaip naudoti atviro kodo programas gali užsiregistruoti į pagalbininkų duomenų bazę.
Visi ieškantys pagalbos, gali susirasti pagalbininką netoliese ir paprašyti pagalbos.
Idėją sugalvojo Jurgis ir jis yra padaręs kažkokį variantą: http://linux-pagalba.appspot.com/ taip pat prieinama per http://pagalba.akl.lt/
Greičiausiai naudosime Nginx + uWSGI. Reikia sukonfigūruoti dislokavimo konfigūraciją, kad tai veiktų.
Puslapyje http://127.0.0.1:8000/accounts/login/ reikia sutvarkyti autorizacijos tiekėjų sąrašo išdėstymą, būtų gerai įtraukti tiekėjo paveiksliukus.
Reikia RSS nuorodų sąrašo iš kurio būtų nuskaitomos naujienų antraštės ir atvaizduojamos puslapyje.
Kažkas panašaus į http://planet.akl.lt/, tik tai turėtų būti rodoma puslapio šoninėje juostoje su nuorodą į http://planet.akl.lt/.
akl.lt svetainės tekstuose pasitaiko nuorodų į wiki. Reikėtų visas tas nuorodas pakeisti į vidinius puslapius importuotus iš wiki.akl.lt.
Susijusios užduotys: #16
Dėl Wagtail riboto funkcionalumo, konvertuojant nuorodas (#23) neišsaugomi fragmento identifikatoriai. Kai tik Wagtail pataisys wagtail/wagtail#1049 šį ribotumą, reikėtų pasitaisyti ir mums.
Neprisijungusiam naudotojui siūlant naujiną rodyti CAPTCHA, kad botai nepostintų naujienų.
Traceback:
File "/home/sirex/.buildout/eggs/Django-1.7-py3.4.egg/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/sirex/.buildout/eggs/Django-1.7-py3.4.egg/django/contrib/syndication/views.py" in __call__
44. feedgen = self.get_feed(obj, request)
File "/home/sirex/.buildout/eggs/Django-1.7-py3.4.egg/django/contrib/syndication/views.py" in get_feed
192. if pubdate and is_naive(pubdate):
File "/home/sirex/.buildout/eggs/Django-1.7-py3.4.egg/django/utils/timezone.py" in is_naive
349. return value.tzinfo is None or value.tzinfo.utcoffset(value) is None
Exception Type: AttributeError at /latest/feed/
Exception Value: 'datetime.date' object has no attribute 'tzinfo'
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.