j1-template 2022.3.0 → 2022.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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[]
|