Giter VIP home page Giter VIP logo

jmc's People

Contributors

gitter-badger avatar konelav avatar nerevar 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

Watchers

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

jmc's Issues

Логирование окон вывода

Логи в окнах вывода пишутся жестко в текстовом виде. Предлагаю сделать возможность для них выбирать формат (TEXT, ANSI, ANSI+RMA, HTML) как для основного лога.

Repair HTML colored logs functionality

  • добавить возможность конвертации логов из ANSI в HTML
  • разобраться со встроенной возможностью вести логи в HTML, а то у меня жаба вылетает при записи в файл цветных логов (ansi on в html пишет нормально)
  • ^ если разбираться с ведением html логов, то сделать нормальную верстку html странички

Crash 3.6 in Settings

Падает в настройках (Actions и Hotkeys).

  1. Открыть настройки
  2. Выбрать Actions или Hotkeys
  3. Выбрать существующий action/hotkey
  4. Удалить текст в поле редактирования значения.

Jmc crash when user gets too many lines with more than 2 substitutes in each string

Aldaran:
Если в строке более 2х замен, а строк 14-15 и более, то жаба вылетает...

[adv gri 15]
Raising Grishnak [decedent] [Attack] Гришнак from level 1 to level 15!
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень.
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень. 
*: [decedent] [Attack] Гришнак поднимаетсЯ на один уровень. 

[decedent] [PK] Алдаран снЯл с себЯ [liMIT] амулет живой земли.
[decedent] [PK] Алдаран снЯл с себЯ факел.
[decedent] [PK] Алдаран снЯл с себЯ знак Ульмо.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] прозрачный браслет.
[decedent] [PK] Алдаран снЯл с себЯ перчатки старого мечника.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] прозрачный браслет.
[decedent] [PK] Алдаран снЯл с себЯ медвежью маску.
[decedent] [PK] Алдаран снЯл с себЯ кольцо * свЯтости *.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] кольцо с глазом медведЯ.
[decedent] [PK] Алдаран снЯл с себЯ всевидЯщие * очки *.
[decedent] [PK] Алдаран снЯл с себЯ длинную юбку.
[decedent] [PK] Алдаран снЯл с себЯ свиток 'очаровать'.
[decedent] [PK] Алдаран снЯл с себЯ кинжал предков.
[decedent] [PK] Алдаран снЯл с себЯ костЯное лезвие.
[decedent] [PK] Алдаран снЯл с себЯ легкий панцирь.
[decedent] [PK] Алдаран снЯл с себЯ курительный жакет.
[decedent] [PK] Алдаран снЯл с себЯ расшитые сапожки.
[decedent] [PK] Алдаран снЯл с себЯ бараньи рога.
[decedent] [PK] Алдаран снЯл с себЯ темный плащ.
[decedent] [PK] Алдаран снЯл с себЯ золотой поЯс с лилиЯми.
[decedent] [PK] Алдаран снЯл с себЯ [liMIT] щит предков.

В этих случаях произошел вылет.

Перезапуск скриптового движка при смене профиля

В данный момент из скрипта весьма проблематично узнать о смене профиля (только постоянным опросом jmc.Profile в обработчике jmc.Incoming и с безосновательным предубеждением, что при загрузке профиля JMC что-нибудь да выдаст).
Логичной выглядела бы полная перезагрузка движка (как при нажатии на Reload scripts).
Можно, впрочем, и новое событие добавить, но вряд ли это имеет смысл.

Add constants with colors

круто бы было если б можно было задавать анси цвета типа $RED или $BLUE для #show в жабе) а не копировать каждый раз эту последовательность символов из других источников.

1. не во всех мадах это стандарт. вот и... что ж до &R... у меня используется похожее решение
#var R ESC[?;3?m
#showme $R\something red

Скриптинг: вызов SetTimer внутри Fire_Timer

При вызове jmc.SetTimer(TimerID,...) в обработчике срабатывания таймера TimerID (например, для смены периода) возможно бесконечное зацикливание.
Это происходит в том случае, если за время просмотра таймеров (цикл в конце ReadMud() ttcoreex.cpp) изменится значение GetTickCount(). Оно сохраняется в начале цикла, а при вызове SetTimer заново вычисляется и проставляется в m_dwLastTickCount. В результате может получиться, что таймер "последний раз сработал" как бы в будущем времени. Беззнаковое вычитание (dwTick - ptm->m_dwLastTickCount) (ttocreex.cpp:1086) даст большое число, заведомо превышающее интервал, обработчик таймера будет снова вызван (Fire_Timer) и т.д.
Надо либо сменить вычитание на знаковое (грамотное решение, включающее обработку момента переполнения и обнуления системного счетчика), либо обновлять значение dwTick = GetTickCount() после каждого FireTimer().

Триггер на несколько строчек сразу

Хочется обрабатывать несколько строчек в одном месте, "склеивать их".

Как пример, получение квеста:

Вы попросили у Маслютика дать вам задание.
Маслютик говорит 'О Нэй, мне нужна ваша помощь!'
Маслютик говорит 'Подлый преступник призрак авантюриста обокрал местный банк'
Маслютик говорит 'и убил девЯть городских стражей!'
Маслютик говорит 'Совершите правосудие и уничтожьте преступника!'
Маслютик говорит 'Ищите призрака авантюриста в месте под названием У маленького дома.'
Маслютик говорит 'Это где-то в районе Руины Форноста (Fornost).'
Маслютик говорит 'У вас есть 28 минут на выполнение заданиЯ, потом будет поздно!'

Может быть обработано с помощью:

#act {quest} {1} {Вы попросили у Маслютика дать вам задание.}
#act {quest} {2} {%1 говорит 'Подлый преступник %2 обокрал местный банк'}
#act {quest} {3} {%1 говорит 'Ищите %3 в месте под названием %4.'}
#act {quest} {4} {%1 говорит 'Это где-то в районе %5.'}
#act {quest} {#var mob %2; #var place %4; #var area %5}

В последней строке общий namespace для переменных, полученных во всех строках.
Тут нужно явно определить первую и последнюю строки, которые обязательны.
Остальные строки в середине опциональны, также между первой и последней строками должно быть не больше N строк (не больше 50-100 например).

Предусмотреть, чтобы строки > 1 не срабатывали, если первая не нашлась.
Предусмотреть удобную систему плейсхолдеров для переменных %1, %2, ..., %25...

Вывод в доп. окна строк с символом амперсанда

Вывод в окна 0, 1, ... строк, содержащих символ '&' некорректен, а именно последние символы этих строк закрашиваются фоном и видны только при выделении мышкой.
Причина: куда-то делся флаг DT_NOPREFIX в pDC->DrawText() (AnsiWnd.cpp:434). Во всех остальных местах он стоит (AnsiWnd.cpp:346, smcView.cpp:437, smcView.cpp:561).

#log crashes the client

log -command with any parameters crashes the client instantly. Log file is created but has nothing in it with the exception of html logs which have 104kb data in it.

Поддержа proxy

Конечно важная фича. Особенно в свете развития Tor и встроенного в него локального SOCKS4/5-сервера.

Видится что-то вроде:

proxy socks4 127.0.0.1:9150

proxy socks5 12.34.56.78 user qwerty

proxy disable

И совсем удобно, если ещё и поддержка proxy-lists:

proxy proxylist.txt 4 (4-ая строка из файла proxylist.txt)

proxy proxylist.txt nextline

Также для Тора будет полезно добавить функцию форсированной смены выходной ноды... но тут надо разобраться, не возникнет ли при этом проблем у открытых TCP-соединений; по идее, не должно бы быть.

#wait крешит жабу

[07.11.13, 10:49:43] Евгений: хм. странно, в жабе 3.6 когда в редактировании конфига набираю #wait - крашит жабу.

Причем пробовал как #+w+a+i+t - на "t" - крашит
Пробовал t+i+a+w+# - справа налево, крашит на "#"

[07.11.13, 10:50:56] Евгений: напрямую если. в строке ввода набрать смотреть;#wait 10;смотреть - работает. смотрит, ждет секунду, смотрит снова

Create JMC github pages website

Создать информационный сайт о JMC на github pages, используя Jekyll и/или Jekyll Bootstrap.

Разделы сайта:

  • Download- версии jmc и краткий changelog
  • Changelog - подробная история изменений
  • Commands - актуальное описание команд жабы, типа #alias
  • Code - примеры кода, JScript
  • ...

#showme выше в приоритете чем #math и #var при обработке триггеров, надо сделать его самым низким

Имею вот такой триггер.
#act {^[%1|%2 %3 %4 (%5ч) %6(%7)} {#math {hpchange} {%1 - $currenthp};#showme $hpchange;#var currenthp %1}
Суть такова. Я хочу считывать текущее хп, сранивать его с предыдущим значением хп и показывать разницу, чтобы видеть на сколько меня накернили.
Но, showme видимо срабатывает раньше чем #math, потому что он всегда мне показывает предыдущее значение.
Пример:

[299|604 90 371 (12ч) 2730834(51692) СВЮЗ ПолупьЯный корсар:корчитсЯ от боли>

Ударом кулака полупьЯный корсар цеплЯет вас!
Острыми зубами бродЯчий пес цеплЯет вас.
Укус бродЯчего пса цеплЯет вас!
Укус бродЯчего пса слегка повреждает вас!
Укус бродЯчего пса цеплЯет вас!
Укус бродЯчего пса слегка повреждает вас!

0
[251|604 90 370 (12ч) 2730834(51692) СВЮЗ ПолупьЯный корсар:корчитсЯ от боли>

Своей дубиной вы встрЯхиваете полупьЯного корсара!
Сильный удар полупьЯного корсара слегка повреждает вас!
Укус бродЯчего пса слегка повреждает вас!

-48
[233|604 90 369 (12ч) 2721743(60783) СВЮЗ ПолупьЯный корсар:почти мертв>

Предлагаю все вычислительные и "назначательные" команды типа #math и #var выполнять в первую очередь при обработке триггеров.
Что касается данного примера, то если я вместо #showme поставлю #var hpchange, то он покажет своё текущее значение которое высчиталось #math'ом, но мне это не подходит потому что там будет целая телега:
{hpchange} == {-8}\033[0;37m
такое читать неудобно, даже когда мы дождёмся фикса вывода сиране ansi цветов

Need to update variable's values in sequence of several commands

JMC does not use new changed variable's value:

Example:

#var target 1
#var target 2;#show output - $target
output - 1
#var temp 1
#var temp 2;#var temp 3;#show "Temp is $temp"
"Temp is 1"

Now, if you want to get exact value of variable, you can use JavaScript:

[#var gameme]
{gameme}={0}

[#scr {jmc.Setvar("gameme", "1");};#scr {jmc.Setvar("gameme", "3");jmc.showme(jmc.GetVar("gameme"))}]
3

Логи: зависание при записи чистого текста

Иногда при логировании в формате Text клиент виснет.
Кейс (можно сделать через MUD-эмулятор): входная строка "\1xb0"
Более обще: строка начинается с символа 0x1B и не содержит символа 'm'.
Причина: в функции processTEXT() (Log.cpp) в указанном случае метод string::erase() вызывается с параметрами (0, 0) и таким образом не меняет строку, т.е. цикл выходит бесконечным.
Необходимо добавить проверку (endEscPos == string::npos).

Команда logpass и логика логирования вообще

Команда logpass не имеет эффекта. Причина: логика логирования такова, что сначала производится запись полученной от сервера строки в лог (проверка bLogPassedLine и вызов ф-ии log()), а только потом выполняется обработка полученной строки (Fire_Incoming(), триггеры, замены, подсветка). Либо это ошибка и ttcoreex.cpp::process_incoming() надо переписать, переставив местами запись в лог и обработку строки (причем в основном цикле порядок как описано, а после цикла в ветке if(!more_coming) порядок обратный, т.е. в редких ситуациях JMC будет работать иначе, чем обычно). Либо такая логика и подразумевалась (в лог пишется as-is, пользователь же видит настроенное под себя отображение), но тогда нужен фикс команды logpass.

Смешивание логов основного и нулевого дополнительного окон

Команды логирования основного окна (log) и нулевого дополнительного (wlog 0) являются синонимами (т.е. имеют ровно одинаковый эффект, в том числе отменяют одна другую). При этом получающийся лог содержит текст из обоих этих окон. С учетом того, что логи окон вывода идут жестко в текстовом формате, может получиться "микс" из строк разного формата.
Можно было бы рассматривать это как фичу, если бы, судя по исходникам, не подразумевалось (ожидаемое пользователем) разделение между этими логами. Функция Logs.cpp::StartLog() принимает первым параметром (wnd) "-1" от команды "log" и "0" от команды "wlog 0", однако далее в тексте идут сравнения типа (wnd > 0), таким образом объединяя эти два случая в один. Видимо, нужно нестрогое сравнение всюду в Logs.cpp::StartLog(int,...) и ещё в Logs.cpp::log(int, string).

Ограничение скорости вывода

навеяно бэкридом
На данный момент JMC прорисовывает строки так быстро, как только может. Соответственно при большом количестве строк для вывода прорисовка (со всеми виндовыми update-ами) происходит максимум 500Гц (фактически, строк в секунду), похоже независимо от железа даже. С учетом монитора (50-60 Гц) и человеческого глаза (24 Гц), это чрезвычайно избыточная скорость. При ограничении до 25 Гц (hard-coded минимальный интервал между update-ами 40 мс), скорость вывода большого количества строк возрастает практически пропорционально (в 15-20 раз).
Предлагаю это сделать, хотя и редко когда это действительно будет полезно, но хуже быть не должно.

Бесконечный цикл

При формировании бесконечного цикла команд - жабу крешит при накоплении како-то буфера..
т.е. набор тригеров:

var tick1 0

ali {тест1}{#out $tick1;#math {tick1}{$tick1+1};тест2}

ali {тест2}{#out $tick1;#math {tick1}{$tick1+1};тест1}

крешит
3.6.1.1 при 53 операциях.
3.0.5 при 32 операции.
3.26 при 80 операциях
А теперь вопрос =)
можно как то увеличить буфер?
Креш я так понимаю из за переполнения очереди команд происходит ведь?

Работа с приглашением

Краеугольный камень MUD'ов, вот проблемы, которые я вижу:

  • не во всех мадах поддерживается GA или EOR для индикации приглашения (пример: старые ROM, из русскоязычных это ещё живой Аладон);
  • не везде поддержка GA/EOR гм "полноценная", пример: GA в Arda-MUD посылается "вслед" за приглашением (отдельным send()), что в TCP в купе с включённым по умолчанию алгоритмом Нейгла выливается в лаг минимум на пинг, а то и на сотни миллисекунд.

В JMC это всё приводит к необходимости использовать костыль "Uncompleted lines delay" (в MMC и zMUD красивого решения я тоже не увидел).

Пока нарисовалось такое решение:

promptend end-of-prompt-sequence [replace-with]

  • указывает JMC, что последовательность символов end-of-prompt-sequence является синонимом Telnet GA/EOR, т.е. индикатором окончания строки приглашения; с учётом того, что в абсолютном большинстве мадов можно устанавливать практически любую строку приглашения, это может быть панацеей, заодно исключив возможность лага сверх необходимого; это может быть любая "абракадабра", которая гарантированно не встретится никогда ни в одной иной строке; для юзера может быть заменена на replace-with, чтобы не портить внешний вид.

onprompt prompt-pattern reaction

  • аналог триггеров #action, но тестится только на строки приглашения и никакие другие.

т.е. интегрально что-то вроде этого:

prompt <%h|%H %m|%M>31415

promptend >31415 >

onprompt {/(.+)|(.+) (.+)|(.+)/} {#var hp %0; #var maxhp %1; #var ma %2; #var maxma %3}

Неправильная работа таймеров при одновременной...

Кто-нибудь проверял одновременную работу большего кол-ва таймеров? Как бы мне кажется что их работа частенько глючит (не всегда)... Пример:
https://www.dropbox.com/s/s4ltckkx3a6ds5i/bug.txt
Хз, мне кажется есть какая-то закономерность, но не уверен, вообщем больше 6 таймеров за раз лучше не запускать:
https://www.dropbox.com/s/bw2fb490dbmum53/timer_work.txt

Немного изменил скрипт на пуск цепочки команд (задержка-команда...предыдущее задержка+новая задержка-команда...). Вообщем доработанный скрипт дробит цепочку, выполняя первые 4 команды, 5й командой идет алиас с запуском этого же скрипта с продолжением цепочки... Полет нормальный...

Add #ungag command

Aldaran:
Отсутствует команда "#ungag", в справке в предыдущей версии jmc 3.5.00 beta от 14 июня она присутствует, но как таковой такой команды нет ни в той, ни в этой версии.

Чёрный цвет в логе HTML-формата

Почему-то при записи логов в HTML-формате на данный момент черные текст и фон отрисовываются как тёмно-серые:
.bl{color:#555}
.b_bl{background-color:#555}
Выглядит не очень и, главное, не так, как в JMC. По-моему, должен быть унифицированный подход: и там и там одинаково.
Соответственно, совсем уж здорово будет генерить CSS-таблицу в зависимости от настроек ANSI-цветов в JMC.

Кнопки

А возможно сделать настраиваемые кнопки?
Или даже лучше отдельную панель..
image

jmc.DropEvent() в обработчике jmc.Incoming

Не работает jmc.DropEvent() при обработке jmc.Incoming. Единственный способ предотвратить появление строки в главном окне -- присвоить jmc.Event не-строковое значение (например, jmc.Event = null), что не очень удобно. Похоже, в ttcoreex.cpp:710 не хватает проверки значения bRet ("if ( bRet && ...")

Логи: аля RMA в HTML

Было бы интересно, на мой взгляд, добавить в HTML-логирование опцию, при включении которой формируемая страничка содержит дополнительные элементы а-ля плеер (пуск, пауза, стоп, ползунок) с построчным выводом текста в соответствии с реальными задержками времени, какими они были при записи лога.

Поддержа MCCP

Перезревшая функция, но при наличии соединения через proxy ещё будет актуальной.
Можно сделать управляемой (#mccp on|off), хотя большого смысла не вижу.

сделать резиновые окна #status

чтобы не были фиксированные, а растягивались в рамках действующей ширины окна, в зависимости от своего содержания.

Crash with last versions of ActivePerl

Try to use both versions from activeperl site:5.20.1.2000 and 5.18.4.1803 And get an Error with PerlSE.dll(shared memory permission denied)
But when i install older versions(which could not be downloaded from official site for free...) 5.6.1.638 script engine works fine.

Компиляция

Здравствуйте,

Подскажите, пожалуйста, это собрать? Чем? Я пробовал VS2010 и VS2015. После определённой работы напильником оно скомпилировалось, однако вылетает в AnsiWnd.cpp:97, т. к. AfxGetMainWnd(); возвращает NULL. Я не силён в MFC, но должно же это как-то собираться, в рабочий билд?

С уважением,
Антон Горев

при логгировании запись строк со временем и датой предлагаю сделать опциональной

записываю в лог (использую #wlog 1 ADD/$charname_$charclass.csv) убиенных мобов, свой уровень и количество полученного опыта (использую ).

из-за записи дат и времени файл mell_Воин.csv принимает такой отвратительный вид

Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 20:34
7,Кто-то,2751
7,Клоп,418
7,Сверчок,4074
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 21:11
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 21:36
7,Тэд,27564
7,Рабочий,9150
7,Косоглазый рабочий,8954
7,ТолстЯчок,7009
7,Рабочий,7541
7,Рабочий,8951
7,Рабочий,7009
7,Рабочий,7259
7,СераЯ мышка,1502
7,Кочегар-лентЯй,8576
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
7,Кочегар-лентЯй,12136
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:26
7,Житель БрылЯ,10856
8,Повариха,40015
8,Серый паук,15172
8,БелаЯ голубка,8849
8,Жаба,4498
8,Жаба,4257
8,Черепашка,1943

8,Волчонок,5466

постоянно приходится чистить логи от бесполезных для меня в данном случае строк:
Log: ADD/mell_Воин.csv
Begin logging to output window #1: 27.02.2015 22:18
Можно ли сделать их появление опциональным?

Цветные триггеры

Очень давняя тема: возможность учитывать в триггерах цвет текста/фона.
Весь вопрос в механизме реализации.
На мой взгляд, правильнее сделать это отдельной сущностью (типа #caction): во-первых, ради полной обратной совместимости, во-вторых ради, собственно, простоты реализации и применения.
Далее, самый простой вариант: проверять цветные триггеры до удаления ansi-команд из строки. Это легко сделать, но, очевидно, возникает проблема правильного (байт-в-байт) ввода, и нет простого механизма это сделать (видимо, писать лог и копипастить нужные строки из него). Предлагается сделать механизм преобразования цветовых ansi-команд такой, чтобы одинаково выглядящие строки транслировались в ровно идентичные байтовые представления (например, удаление команд не имеющих эффекта: дублирующих предыдущие цвет-фон или после которых до следующей команды нет текста). При этом можно заменить сами команды чем-то более легко читаемым/печатаемым (как, например, в ROM "{" или в SMAUG "&" "^*").

Запись в лог showme и jmc.ShowMe()

Предлагаю добавить запись в лог сообщений, показываемых командами showme и из скрипта (jmc.ShowMe()). Это, в общем, перекликается с вопросом идеологии логирования: писать "как показывает происходящее MUD" или "как видит происходящее игрок". Возможно, имеет смысл ввести такую глобальную настройку даже.
Предлагаемое же делается элементарно: добавлением в CJmcObj::ShowMe() и Misc.cpp::showme_command() кода log(processLine(...)); log("\n");

Кордамп при выводе в файл (#wlog)

Ошибка была внесена в ревизии f73840c

Logs.cpp:251:sprintf(logTitle, rs::rs(1258) , logName);

Происходит обращение к ресурсу с номером 1258, который не существует:

    1257                    "#Auto reconnect is now %s."
END

В результате rs::rs(1258) возвращает NULL и sprintf пытается напечатать строку по нулевому адресу. Что и приводит к кордампу.

Решение:

  1. Добавить отсутствующую строку-ресурс;
  2. Добавить проверку на NULL после вытаскивания строки.

Script crash on Windows 8.1

Trying to access the JMC.* functions/object from a script in Windows 8.1 crashes JMC or the script, depending on what language is selected.

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.