j1-template 2022.3.0 → 2022.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/assets/themes/j1/adapter/js/cookieConsent.js +1 -1
- data/assets/themes/j1/adapter/js/nbinteract.js +174 -81
- data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +1 -0
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/Gemfile +1 -1
- data/lib/starter_web/_config.yml +1 -1
- data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +4 -1
- data/lib/starter_web/_plugins/lunr_index.rb +1 -1
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/pages/public/jupyter/docs/j1-nbinteract-doc.adoc +21 -6
- data/lib/starter_web/pages/public/jupyter/docs/nbi-widget-manual.adoc +6 -6
- data/lib/starter_web/pages/public/jupyter/docs/nbinteract-doc.adoc +11 -6
- data/lib/starter_web/pages/public/jupyter/examples/j1-circular-times-table.adoc +10 -11
- data/lib/starter_web/pages/public/jupyter/examples/j1-interactive-widgets.adoc +9 -5
- data/lib/starter_web/pages/public/jupyter/examples/j1-odes-in-python.adoc +10 -6
- data/lib/starter_web/pages/public/jupyter/examples/j1-testing-plotly.adoc +13 -4
- data/lib/starter_web/pages/public/jupyter/examples/j1_climate-change-forecast.adoc +4 -4
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-checkpoint.ipynb +12387 -0
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +10 -10
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_circular_times_table.ipynb +10 -13
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_odes_in_python.ipynb +15 -15
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/line_by_line.mp4 +0 -0
- data/lib/starter_web/pages/public/jupyter/notebooks/j1/point_by_point.mp4 +0 -0
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_circular_times_table.html +6 -9
- data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +10 -10
- data/lib/starter_web/pages/public/jupyter/services/jupyterhub.adoc +6 -7
- data/lib/starter_web/pages/public/se/se-fake.adoc +47 -0
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e8a8bf49396d4fe36c0390c3d0e56028fc6836f7d796a0a848d4446a4925c0a
|
4
|
+
data.tar.gz: ff9e9fb6c8063c8f623a72a5ca396cbd0aba4e2bc7b6de639c53e4ad224c1830
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e662b6d65a3a15424e157bfb2acb767575dac5c31cb65b2ec3d4ba575ef534d40de491e981a523330765cc8f198157b03f02ce623b6fca6c47e4df12bfeb9194
|
7
|
+
data.tar.gz: 2872c3531e4f5adecb327af16d5cb7cac8e680b3cfb44b5f3d07121eb3d47a827e86c1ff2a8887391aaf9223744b0ea94cad5c46961a08a8747933fd5c356693
|
@@ -212,7 +212,7 @@ j1.adapter.cookieConsent = (function (j1, window) {
|
|
212
212
|
cookieSecure: secure, // only sent to the server with an encrypted request over HTTPS
|
213
213
|
cookieDomain: domainAttribute, // set domain (hostname|domain)
|
214
214
|
dialogLanguage: moduleOptions.dialogLanguage, // language for the dialog (modal)
|
215
|
-
whitelisted: moduleOptions.whitelisted, // pages
|
215
|
+
whitelisted: moduleOptions.whitelisted, // pages NO cookie dialog is shown
|
216
216
|
reloadPageOnChange: moduleOptions.reloadPageOnChange, // reload if setzings has changed
|
217
217
|
dialogContainerID: moduleOptions.dialogContainerID, // container, the dialog modal is (dynamically) loaded
|
218
218
|
xhrDataElement: moduleOptions.xhrDataElement, // container for all language-specific dialogs (modals)
|
@@ -83,6 +83,9 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
83
83
|
var moduleOptions = {};
|
84
84
|
var moduleSettings = {};
|
85
85
|
var message = {};
|
86
|
+
var flags = {
|
87
|
+
checkURL: false
|
88
|
+
};
|
86
89
|
var spinnerOpts = { // (default) options for a spinner
|
87
90
|
lines: 13, // number of lines to draw
|
88
91
|
length: 38, // length of each line
|
@@ -107,7 +110,8 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
107
110
|
var nbiContentModalInfoID = 'nbiModalInfoBody'; // ID of the content (messages) for the INFO modal
|
108
111
|
var nbiContentModalSuccessID = 'nbiModalSuccessBody'; // ID of the content (messages) for the SUCCESS modal
|
109
112
|
var nbiContentModalErrorID = 'nbiModalErrorBody'; // ID of the content (messages) for the SUCCESS modal
|
110
|
-
var
|
113
|
+
var nbiModalTopInfo = '#' + 'nbiModalTopInfo'; // ID of the TopInfo modal
|
114
|
+
var nbiModalTRInfo = '#' + 'nbiModalTRInfo'; // ID of the TRInfo modal
|
111
115
|
var nbiModalSuccessID = '#' + 'nbiModalTRSuccess'; // ID of the SUCCESS modal
|
112
116
|
var nbiModalErrorID = '#' + 'nbiModalTLDanger'; // ID of the ERROR modal
|
113
117
|
var nbinteract_prepared = false; // switch to indicate if ???
|
@@ -187,6 +191,7 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
187
191
|
// run a spinner to indicate activity of 'nbInteract' if enabled
|
188
192
|
// -------------------------------------------------------------------
|
189
193
|
$(document).ready(function() {
|
194
|
+
|
190
195
|
if (nbiIndicateNbiActivity && !spinnerStarted) {
|
191
196
|
spinnerStarted = true;
|
192
197
|
target = document.getElementById('content');
|
@@ -391,98 +396,124 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
391
396
|
// controlled by nbinteract_prepared.
|
392
397
|
// -------------------------------------------------------------------------
|
393
398
|
interactNbiTextbooks: function (options) {
|
399
|
+
var state;
|
394
400
|
var textbook = options;
|
395
401
|
|
396
402
|
// initialize state flag
|
397
403
|
_this.setState('started');
|
398
404
|
logger.debug('\n' + 'state: ' + _this.getState());
|
399
405
|
|
406
|
+
// check if the Binder Service is available
|
407
|
+
//
|
408
|
+
_this.checkURL(options.baseUrl, flags);
|
409
|
+
|
400
410
|
var log_text = '\n' + 'nbinteract is being initialized';
|
401
411
|
logger.info(log_text);
|
402
412
|
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
logger.info(logText);
|
413
|
+
var dependencies_met_binder_responsive = setInterval(function() {
|
414
|
+
state = _this.getState();
|
415
|
+
if (state == 'finished_checks') {
|
416
|
+
clearInterval(dependencies_met_binder_responsive);
|
417
|
+
if (flags.checkURL) {
|
418
|
+
{% comment %} initialize nbinteract per textbook
|
419
|
+
{% assign textbook_spec = item.textbook.spec %}
|
420
|
+
{% assign textbook_baseUrl = item.textbook.baseUrl %}
|
421
|
+
{% assign textbook_provider = item.textbook.provider %}
|
422
|
+
-------------------------------------------------------------------------- {% endcomment %}
|
423
|
+
{% for item in nbinteract_options.textbooks %} {% if item.textbook.enabled %}
|
424
|
+
{% assign textbook_id = item.textbook.id %}
|
425
|
+
|
426
|
+
if ($('#{{textbook_id}}').length) {
|
427
|
+
var dependencies_met_nb_loaded = setInterval(function() {
|
428
|
+
if ($('#{{textbook_id}}').attr('data-nb-textbook') == 'loaded') {
|
429
|
+
|
430
|
+
var nbiButtonsFound = document.querySelectorAll('.js-nbinteract-widget').length
|
431
|
+
if (nbiIndicateNbiActivity && nbiButtonsFound == 1) {
|
432
|
+
var log_text = '\n' + 'non-nbi textbook found, skip NBI initialization for: {{textbook_id}}';
|
433
|
+
logger.warn(log_text);
|
434
|
+
spinner.stop();
|
435
|
+
}
|
427
436
|
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
437
|
+
if(!nbinteract_prepared && nbiButtonsFound > 1) {
|
438
|
+
logText = '\n' + 'jupyter kernel is being generated ...';
|
439
|
+
logger.info(logText);
|
440
|
+
|
441
|
+
// create nbInteract (core) instance
|
442
|
+
//
|
443
|
+
coreLogger = log4javascript.getLogger('nbinteract.core');
|
444
|
+
interact = new NbInteract({
|
445
|
+
spec: options.spec,
|
446
|
+
baseUrl: options.baseUrl,
|
447
|
+
provider: options.provider,
|
448
|
+
logger: coreLogger,
|
449
|
+
j1API: j1,
|
450
|
+
});
|
451
|
+
|
452
|
+
// generate a jupyter kernel via BinderHub
|
453
|
+
interact.prepare();
|
454
|
+
nbinteract_prepared = true;
|
455
|
+
|
456
|
+
// issue an error if the NBI (init) button never removed by
|
457
|
+
// nbInteract-core (util or manager)
|
458
|
+
// TODO: The 'timeout' condition should be replaced
|
459
|
+
// state-based triggered from nbInteract-core.
|
460
|
+
//
|
461
|
+
window.setTimeout(function() {
|
462
|
+
var nbiButtonState = _this.getNbiButtonState();
|
463
|
+
if (nbiButtonState) {
|
464
|
+
// button NOT removed
|
465
|
+
logger.warn('NBI initialialization failed on textbook: {{textbook_id}}');
|
466
|
+
// hide the info modal
|
467
|
+
$(nbiModalSuccessID).modal('hide');
|
468
|
+
|
469
|
+
// show the error modal
|
470
|
+
$(nbiModalSuccessID).on('hidden.bs.modal', function () {
|
471
|
+
if ($(nbiModalErrorID).is(':hidden')) {
|
472
|
+
var messageErrorUL = document.getElementById(nbiModalErrorMessagesID);
|
473
|
+
_this.appendModalMessage(messageErrorUL, 'NBI initialialization failed for textbook: {{textbook_id}}')
|
474
|
+
$(nbiModalErrorID).modal('show');
|
475
|
+
|
476
|
+
// auto-close the error modal
|
477
|
+
if (nbiModalAutoClose) {
|
478
|
+
window.setTimeout(function() {
|
479
|
+
$(nbiModalErrorID).modal('hide');
|
480
|
+
}, nbiModalAutoCloseDelay);
|
481
|
+
}
|
482
|
+
}
|
483
|
+
});
|
484
|
+
} else {
|
485
|
+
// button removed
|
486
|
+
logger.info('NBI initialized successfully.');
|
468
487
|
}
|
469
|
-
}
|
470
|
-
|
471
|
-
|
472
|
-
// button removed
|
473
|
-
logger.info('NBI initialized successfully.');
|
474
|
-
}
|
475
|
-
}, nbiInitTimeout);
|
488
|
+
}, nbiInitTimeout);
|
489
|
+
|
490
|
+
}
|
476
491
|
|
492
|
+
clearInterval(dependencies_met_nb_loaded);
|
493
|
+
} // END dependencies_met_nb_loaded
|
494
|
+
}, 25);
|
495
|
+
return;
|
496
|
+
}
|
497
|
+
// END textbook_id: {{ textbook_id }}
|
498
|
+
{% endif %} {% endfor %}
|
499
|
+
} else {
|
500
|
+
spinner.stop();
|
501
|
+
var modaBodyText = `
|
502
|
+
The <i>Binder Service</i> is currently not available or is overloaded.
|
503
|
+
All interactive components on the page are <b>not</b> available.
|
504
|
+
You can reload the page or re-open later again.
|
505
|
+
`;
|
506
|
+
logger.error('\n', 'Binder access: failed');
|
507
|
+
if ($(nbiModalTRInfo).is(':hidden')) {
|
508
|
+
document.getElementById('nbiModalTRInfoBody').innerHTML = modaBodyText;
|
509
|
+
$(nbiModalTRInfo).modal('show');
|
477
510
|
}
|
511
|
+
clearInterval(dependencies_met_binder_responsive);
|
512
|
+
}
|
513
|
+
|
514
|
+
}
|
515
|
+
}, 25); // END dependencies_met_binder_responsive
|
478
516
|
|
479
|
-
clearInterval(dependencies_met_nb_loaded);
|
480
|
-
} // END dependencies_met_nb_loaded
|
481
|
-
}, 25);
|
482
|
-
return;
|
483
|
-
}
|
484
|
-
// END textbook_id: {{ textbook_id }}
|
485
|
-
{% endif %} {% endfor %}
|
486
517
|
},
|
487
518
|
|
488
519
|
// -------------------------------------------------------------------------
|
@@ -815,6 +846,45 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
815
846
|
</div>
|
816
847
|
</div>
|
817
848
|
`
|
849
|
+
|
850
|
+
const nbiModalTRInfo = `
|
851
|
+
<div id="nbiModalTRInfo"
|
852
|
+
class="modal fade right"
|
853
|
+
tabindex="-1"
|
854
|
+
role="dialog"
|
855
|
+
aria-labelledby="myModalLabel" aria-hidden="true"
|
856
|
+
data-bs-keyboard="false"
|
857
|
+
data-bs-backdrop="static">
|
858
|
+
<div class="modal-dialog modal-dialog-scrollable modal-side-2x modal-top-right modal-notify modal-success" role="document">
|
859
|
+
<!-- Content -->
|
860
|
+
<div class="modal-content">
|
861
|
+
<!-- Header -->
|
862
|
+
<div class="modal-header">
|
863
|
+
<p class="lead">Information</p>
|
864
|
+
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
865
|
+
<i class="mdi mdi-close mdi-dark mdi-48px"></i>
|
866
|
+
</button>
|
867
|
+
</div>
|
868
|
+
<!-- Icon -->
|
869
|
+
<div class="text-center">
|
870
|
+
<i class="mdi mdi-10x mdi-information-variant mdi-spin md-green mb-1"></i>
|
871
|
+
</div>
|
872
|
+
<!-- Body -->
|
873
|
+
<div id="nbiModalTRInfoBody" class="modal-body">
|
874
|
+
<div>
|
875
|
+
<p> Placeholder </p>
|
876
|
+
</div>
|
877
|
+
</div>
|
878
|
+
<!-- Footer -->
|
879
|
+
<div class="modal-footer justify-content-center">
|
880
|
+
<a type="button" class="btn btn-primary" data-bs-dismiss="modal">OK, thanks</a>
|
881
|
+
</div>
|
882
|
+
</div>
|
883
|
+
<!-- END Content -->
|
884
|
+
</div>
|
885
|
+
</div>
|
886
|
+
`
|
887
|
+
|
818
888
|
const nbiModalTRSuccess = `
|
819
889
|
<div id="nbiModalTRSuccess"
|
820
890
|
class="modal fade right"
|
@@ -828,7 +898,7 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
828
898
|
<div class="modal-content">
|
829
899
|
<!-- Header -->
|
830
900
|
<div class="modal-header">
|
831
|
-
<p class="lead">
|
901
|
+
<p class="lead">NBI - Information</p>
|
832
902
|
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
833
903
|
<i class="mdi mdi-close mdi-dark mdi-48px"></i>
|
834
904
|
</button>
|
@@ -853,6 +923,7 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
853
923
|
</div>
|
854
924
|
</div>
|
855
925
|
`
|
926
|
+
|
856
927
|
const nbiModalTLDanger = `
|
857
928
|
<div id="nbiModalTLDanger"
|
858
929
|
class="modal fade left"
|
@@ -866,7 +937,7 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
866
937
|
<div id="nbiModalErrorBody" class="modal-content">
|
867
938
|
<!--Header-->
|
868
939
|
<div class="modal-header">
|
869
|
-
<p class="lead">
|
940
|
+
<p class="lead">NBI - Error</p>
|
870
941
|
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
871
942
|
<i class="mdi mdi-close mdi-dark mdi-48px"></i>
|
872
943
|
</button>
|
@@ -897,6 +968,12 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
897
968
|
nbiModal.innerHTML = nbiModalTopInfo;
|
898
969
|
document.body.appendChild(nbiModal);
|
899
970
|
|
971
|
+
nbiModal = document.createElement('div');
|
972
|
+
nbiModal.id = 'nbi-modal-info';
|
973
|
+
nbiModal.className = 'nbi-modal';
|
974
|
+
nbiModal.innerHTML = nbiModalTRInfo;
|
975
|
+
document.body.appendChild(nbiModal);
|
976
|
+
|
900
977
|
nbiModal = document.createElement('div');
|
901
978
|
nbiModal.id = 'nbi-modal-success';
|
902
979
|
nbiModal.className = 'nbi-modal';
|
@@ -1096,6 +1173,22 @@ j1.adapter.nbinteract = (function (j1, window) {
|
|
1096
1173
|
return _this.state;
|
1097
1174
|
}, // END getState
|
1098
1175
|
|
1176
|
+
// -------------------------------------------------------------------------
|
1177
|
+
// getState()
|
1178
|
+
// Returns the current (processing) state of the module
|
1179
|
+
// -------------------------------------------------------------------------
|
1180
|
+
checkURL: function (uri, flags) {
|
1181
|
+
_this.setState('process_checks');
|
1182
|
+
$.get(uri).done(function () {
|
1183
|
+
_this.setState('finished_checks');
|
1184
|
+
flags.checkURL = true;
|
1185
|
+
return true;
|
1186
|
+
}).fail(function () {
|
1187
|
+
_this.setState('finished_checks');
|
1188
|
+
flags.checkURL = false;
|
1189
|
+
});
|
1190
|
+
|
1191
|
+
}, // END checkURL
|
1099
1192
|
// -------------------------------------------------------------------------
|
1100
1193
|
// appendModalMessage()
|
1101
1194
|
// Appends a message to given (NBI) modal
|
@@ -365,6 +365,7 @@ function CookieConsent(props) {
|
|
365
365
|
// call consent dialog if no cookie found or cookie NOT accepted (except whitelisted pages)
|
366
366
|
//
|
367
367
|
whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
|
368
|
+
|
368
369
|
var consentCookie = Cookie.get(this.props.cookieName);
|
369
370
|
if ((consentCookie === undefined || consentCookie === "false") && this.props.autoShowDialog && !whitelisted) {
|
370
371
|
showDialog();
|
data/lib/j1/version.rb
CHANGED
data/lib/starter_web/Gemfile
CHANGED
@@ -53,7 +53,7 @@ gem 'jekyll', '~> 4.2'
|
|
53
53
|
|
54
54
|
# Theme Rubies, default: J1 Template (NOT used for the development system)
|
55
55
|
#
|
56
|
-
gem 'j1-template', '~> 2022.3.
|
56
|
+
gem 'j1-template', '~> 2022.3.1'
|
57
57
|
|
58
58
|
# ------------------------------------------------------------------------------
|
59
59
|
# PRODUCTION: Gem needed for the Jekyll and J1 prod environment
|
data/lib/starter_web/_config.yml
CHANGED
@@ -53,7 +53,7 @@ environment: development
|
|
53
53
|
# ------------------------------------------------------------------------------
|
54
54
|
# Sets the build version of J1 Template Gem
|
55
55
|
#
|
56
|
-
version: 2022.3.
|
56
|
+
version: 2022.3.1
|
57
57
|
|
58
58
|
# version
|
59
59
|
# ------------------------------------------------------------------------------
|
@@ -35,7 +35,10 @@ defaults:
|
|
35
35
|
# cookieStorageDays: 365 # duration the consent cookie is stored
|
36
36
|
# cookieSameSite: Strict # restrict consent cookie to first-party, do NOT send cookie to other domains
|
37
37
|
reloadPageOnChange: true # reload current page if user settings has been changed
|
38
|
-
whitelisted: [
|
38
|
+
whitelisted: [ # pages NO consent issued
|
39
|
+
'/pages/public/legal/en/privacy/',
|
40
|
+
'/pages/public/se-fake/',
|
41
|
+
]
|
39
42
|
xhrDataElement: consent-data # container for all language-specific consent modals (taken from contentURL)
|
40
43
|
dialogContainerID: consent-dialog # container, the dialog modal is (dynamically) loaded
|
41
44
|
postSelectionCallback: j1.adapter.cookieConsent.cbCookie # called after the user has made his selection
|
@@ -60,11 +60,12 @@ resource_options:
|
|
60
60
|
|
61
61
|
// Set (local) page attributes here
|
62
62
|
// -----------------------------------------------------------------------------
|
63
|
-
// :page--attr:
|
64
|
-
:binder-badges-enabled:
|
65
|
-
:binder--home:
|
66
|
-
:binder--docs:
|
67
|
-
:
|
63
|
+
// :page--attr: <attr-value>
|
64
|
+
:binder-badges-enabled: true
|
65
|
+
:binder--home: https://mybinder.org/
|
66
|
+
:binder--docs: https://mybinder.readthedocs.io/en/latest/
|
67
|
+
:github-repo--binderhub: https://github.com/jupyterhub/binderhub
|
68
|
+
:binder-app-launch--tree: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?urlpath=/tree
|
68
69
|
|
69
70
|
// Load Liquid procedures
|
70
71
|
// -----------------------------------------------------------------------------
|
@@ -94,6 +95,11 @@ endif::[]
|
|
94
95
|
|
95
96
|
// info: https://en.wikipedia.org/wiki/Galileo_Galilei
|
96
97
|
|
98
|
+
CAUTION: Each interactive element presented on this page uses *time-consuming*
|
99
|
+
operations that take a while to finish. The images and the interactive
|
100
|
+
elements are built through a backend in the cloud. Please be patient
|
101
|
+
to see the results.
|
102
|
+
|
97
103
|
The Jupyter Project is a non-profit organization founded in 2014 by
|
98
104
|
_Fernando Perez_. The Jupyter project supports interactive scientific
|
99
105
|
Data evaluations and scientific calculations. The main applications provided
|
@@ -163,6 +169,15 @@ It is customizable and scalable and is suitable for small and large teams,
|
|
163
169
|
academic courses, and large-scale infrastructure (for example like the
|
164
170
|
Binder service).
|
165
171
|
|
172
|
+
== Binder
|
173
|
+
|
174
|
+
Binder allows you to create custom computing environments that can be
|
175
|
+
shared and used by many remote users. A Binder service is powered by
|
176
|
+
link:{github-repo--binderhub}[BinderHub Repo on Github, {browser-window--new}],
|
177
|
+
an open-source tool that runs on Kubernetes, a portable, extensible,
|
178
|
+
open-source platform for managing containerized services. One such deployment
|
179
|
+
lives at link:{binder--home}[Binder Home, {browser-window--new}], and is free
|
180
|
+
to use.
|
166
181
|
|
167
182
|
== The Package nbInteract (NBI)
|
168
183
|
|
@@ -480,7 +495,7 @@ regenerate: true
|
|
480
495
|
|
481
496
|
resources: [ nbinteract, rouge ] <2>
|
482
497
|
----
|
483
|
-
<1> Binder's services require *Personalization* accepted in the users
|
498
|
+
<1> Binder's services require *Personalization* accepted in the users
|
484
499
|
*cookie* settings. Difficulties with the rules of privacy should be
|
485
500
|
explicitly pointed out and responded to in a suitable form if the cookie
|
486
501
|
settings of the visitor do not allow this.
|
@@ -53,12 +53,12 @@ resource_options:
|
|
53
53
|
|
54
54
|
// Set (local) page attributes here
|
55
55
|
// -----------------------------------------------------------------------------
|
56
|
-
// :page--attr:
|
57
|
-
:badges-enabled:
|
58
|
-
:binder-badge-enabled:
|
59
|
-
:binder--home:
|
60
|
-
:binder--docs:
|
61
|
-
:binder-app-launch--tree:
|
56
|
+
// :page--attr: <attr-value>
|
57
|
+
:badges-enabled: false
|
58
|
+
:binder-badge-enabled: false
|
59
|
+
:binder--home: https://mybinder.org/
|
60
|
+
:binder--docs: https://mybinder.readthedocs.io/en/latest/
|
61
|
+
:binder-app-launch--tree: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?urlpath=/tree
|
62
62
|
|
63
63
|
// Load Liquid procedures
|
64
64
|
// -----------------------------------------------------------------------------
|
@@ -60,12 +60,12 @@ resource_options:
|
|
60
60
|
|
61
61
|
// Set (local) page attributes here
|
62
62
|
// -----------------------------------------------------------------------------
|
63
|
-
// :page--attr:
|
64
|
-
:badges-enabled:
|
65
|
-
:binder-badge-enabled:
|
66
|
-
:binder--home:
|
67
|
-
:binder--docs:
|
68
|
-
:binder-app-launch--tree:
|
63
|
+
// :page--attr: <attr-value>
|
64
|
+
:badges-enabled: true
|
65
|
+
:binder-badge-enabled: false
|
66
|
+
:binder--home: https://mybinder.org/
|
67
|
+
:binder--docs: https://mybinder.readthedocs.io/en/latest/
|
68
|
+
:binder-app-launch--tree: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?urlpath=/tree
|
69
69
|
|
70
70
|
// Load Liquid procedures
|
71
71
|
// -----------------------------------------------------------------------------
|
@@ -123,6 +123,11 @@ In addition, `nbinteract` provides a Python package. Once imported, the package
|
|
123
123
|
provides helper methods that allow users to create simple interactive
|
124
124
|
visualizations with single function calls.
|
125
125
|
|
126
|
+
CAUTION: Each interactive element presented on this page uses *time-consuming*
|
127
|
+
operations that take a while to finish. The images and the interactive
|
128
|
+
elements are built through a backend in the cloud. Please be patient
|
129
|
+
to see the results.
|
130
|
+
|
126
131
|
== Getting Started
|
127
132
|
|
128
133
|
The following pages will show you how to use `nbinteract` and its related
|
@@ -1,5 +1,5 @@
|
|
1
1
|
---
|
2
|
-
title:
|
2
|
+
title: Times Tables
|
3
3
|
tagline: visualize patterns
|
4
4
|
date: 2022-03-28 00:00:00
|
5
5
|
description: >
|
@@ -55,12 +55,11 @@ resource_options:
|
|
55
55
|
|
56
56
|
// Set (local) page attributes here
|
57
57
|
// -----------------------------------------------------------------------------
|
58
|
-
// :page--attr:
|
59
|
-
:binder-badges-enabled:
|
60
|
-
:binder-app-launch--tree:
|
61
|
-
:binder-app-launch--notebook:
|
62
|
-
|
63
|
-
:time-tables-visualization: https://elc.github.io/posts/times-tables/
|
58
|
+
// :page--attr: <attr-value>
|
59
|
+
:binder-badges-enabled: true
|
60
|
+
:binder-app-launch--tree: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?urlpath=/tree
|
61
|
+
:binder-app-launch--notebook: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?filepath=notebooks/j1/j1_circular_times_table.ipynb
|
62
|
+
:times-tables-visualization: https://elc.github.io/posts/times-tables/
|
64
63
|
|
65
64
|
// Load Liquid procedures
|
66
65
|
// -----------------------------------------------------------------------------
|
@@ -83,7 +82,7 @@ image:https://mybinder.org/badge_logo.svg[Binder, link="{binder-app-launch--tree
|
|
83
82
|
endif::[]
|
84
83
|
|
85
84
|
NOTE: All examples are taken from
|
86
|
-
link:{
|
85
|
+
link:{times-tables-visualization}[Times Tables Visualization - Finding Patterns, {browser-window--new}],
|
87
86
|
and re-written for the use of module J1 NBI. Some text is used from the
|
88
87
|
original post but re-written for clarity and simplicity.
|
89
88
|
|
@@ -126,12 +125,12 @@ what _Mathologer_ is doing:
|
|
126
125
|
* an animated version to construct the image Factor by Factor: the lines
|
127
126
|
and the number of points is fixed, but the factor increases per iteration.
|
128
127
|
|
129
|
-
|
128
|
+
Start your journey on the power of Mathematics!
|
129
|
+
|
130
|
+
CAUTION: Each interactive element presented on this page uses *time-consuming*
|
130
131
|
operations that take a while to finish. The images and the interactive
|
131
132
|
elements are built through a backend in the cloud. Please be patient
|
132
133
|
to see the results.
|
133
134
|
|
134
|
-
Start your journey on the power of Mathematics!
|
135
|
-
|
136
135
|
// textbook::circular_times_table[]
|
137
136
|
textbook::j1_circular_times_table[]
|
@@ -60,11 +60,10 @@ resource_options:
|
|
60
60
|
|
61
61
|
// Set (local) page attributes here
|
62
62
|
// -----------------------------------------------------------------------------
|
63
|
-
// :page--attr:
|
64
|
-
:binder-badges-enabled:
|
65
|
-
:binder-app-launch--tree:
|
66
|
-
:binder-app-launch--notebook:
|
67
|
-
|
63
|
+
// :page--attr: <attr-value>
|
64
|
+
:binder-badges-enabled: true
|
65
|
+
:binder-app-launch--tree: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?urlpath=/tree
|
66
|
+
:binder-app-launch--notebook: https://mybinder.org/v2/gh/jekyll-one/j1-binder-repo/main?filepath=notebooks/j1/j1_interactive_widgets.ipynb
|
68
67
|
|
69
68
|
// Load Liquid procedures
|
70
69
|
// -----------------------------------------------------------------------------
|
@@ -98,4 +97,9 @@ the most used. Interactive widgets are provided natively by Jupyter Notebooks
|
|
98
97
|
using the library `ipywidgets`. Some more widgets are provided by `nbinteract`.
|
99
98
|
Find common examples in the textbooks below.
|
100
99
|
|
100
|
+
CAUTION: Each interactive element presented on this page uses *time-consuming*
|
101
|
+
operations that take a while to finish. The images and the interactive
|
102
|
+
elements are built through a backend in the cloud. Please be patient
|
103
|
+
to see the results.
|
104
|
+
|
101
105
|
textbook::j1_interactive_widgets[]
|