5, 10 or 20 seats+ for your team - learn more
The Creative Programmer is a fantastic mix of engaging historical anecdotes, practical exercises, and extensive references to papers, books, and essays both in and outside of programming…. My own copy has now been filled with pages of scribbles and notes on which I could immediately apply Wouter’s lessons, a sign that his exercises are truly engaging and encouraging!
Beautifully written and utterly compelling. I love the research, the insight, and the sheer joy Wouter conveys in his writing.
You can see this entire book for free. Click anywhere in the table of contents to start reading detailed TOC';
var tocServerVars = {
productId: 2544,
getTocUrl: "/ajax/getTocHtml"
}
var tocStatusResolved = false;
$(document).ready(loadTocIfVisible);
function loadTocIfVisible(){
if(tocStatusResolved) { return; }
if($('.toc-loading-container').isInViewport()){
window.removeEventListener("scroll", loadTocIfVisible);
$(window).off("scroll", loadTocIfVisible);
loadToc();
}
}
try {
window.addEventListener("scroll", loadTocIfVisible, { passive: true});
}
catch(e){
$(window).on("scroll", loadTocIfVisible);
}
function loadToc(){
tocStatusResolved = true;
window.TocProvider.getToc(function (tocHtml) {
var $tocLoadingContainer = $('.toc-loading-container');
$tocLoadingContainer.closest(".table-of-contents").prepend(titleHtml);
$tocLoadingContainer.replaceWith(tocHtml);
initializeToc();
}, function(){
$('.toc-loading-container').remove()
});
}
window.TocProvider = {
toc: "",
getToc: function(success, failure){
if(this.toc) { success && success(this.toc); return; }
$.ajax({
url: tocServerVars.getTocUrl,
data: {
id: tocServerVars.productId
}
}).done(function(data){
if(data && data.tocHtml){
this.toc = data.tocHtml;
success && success(this.toc);
}
else {
failure && failure();
}
}).fail(function(error){
failure && failure();
});
}
};
}
catch (e) {}
})();
function initializeToc(){
// Append this only when children of their sectionbody siblings exist (appendices generally aren't expandable)
$(".sectionbody *").children("*").parents(".sectionbody").siblings("h2").wrapInner("").append(controllo);
$(".toc h2 > .chap-link, .toc h1, .toc h3, .toc h4").each(function() {
$(this).html($(this).html().replace(/^(\b\w[0-9A-Z]{0,1}\b\.?)+\s/gi, "$&"));
});
$(".sectionbody").addClass("hidden-toc");
$("body").on("click", ".toc-expando", function(e) {
e.stopPropagation();
$(this).removeClass("toc-expando").addClass("toc-retracto").closest(".sect1").find(".sectionbody").removeClass("hidden-toc").addClass("shown-toc");
});
$("body").on("click", ".toc-retracto", function(e) {
e.stopPropagation();
$(this).removeClass("toc-retracto").addClass("toc-expando").closest(".sect1").find(".sectionbody").removeClass("shown-toc").addClass("hidden-toc");
});
$("body").on("click", ".available h2", function() {
$(this).find(".toc-controllo").click();
});
$("body").on("click", "#show-hide", function() {
if ($("#show-hide").hasClass("hide-full-toc")) {
$(".table-of-contents .sect2, .table-of-contents .sect3").removeClass("shown-toc").addClass("hidden-toc");
$("#show-hide").removeClass("hide-full-toc").html(" detailed TOC");
$(".table-of-contents .body").removeClass("full-toc");
$(".toc-retracto").click();
} else {
$(".table-of-contents .sect2, .table-of-contents .sect3").addClass("shown-toc").removeClass("hidden-toc");
$("#show-hide").addClass("hide-full-toc").html(" detailed TOC");
$(".table-of-contents .body").addClass("full-toc");
$(".toc-expando").click();
}
});
var wrapTocWithLink = function(tocElement, livebookUrl, chapterNumber) {
var urlParams = "?origin=product-toc";
$(tocElement).children(".chap-link").wrap("");
if (!$(tocElement).children().length) {
$(tocElement).html("" + $(tocElement).text() + "");
}
$(tocElement).parent().prepend('Read in liveBook');
$(tocElement).parent().children("div[class*='sectionbody']").each(function(j, sectionsParent) {
$(sectionsParent).children().each(function(k, sectionParent) {
$(sectionParent).children("h3").each(function(l, section) {
//wrap section in an a tag linking to livebook section k + 1
var sectionUrl = livebookUrl + "/section-" + chapterNumber + "-" + (k + 1);
$(section).wrap("");
});
$(sectionParent).children("div[class='sect3']").each(function(m, subsectionParent) {
$(subsectionParent).children("h4").each(function(n, subsection) {
//wrap section in an a tag linking to livebook subsection m + 1
var subsectionUrl = livebookUrl + "/section-" + chapterNumber + "-" + (k + 1) + "-" + (m + 1);
$(subsection).wrap("");
});
});
});
});
};
var $availableChapters = $("h2[id*='chapter_id_']").filter(function(i, chapter) {
return $(chapter).parent().hasClass('available');
});
// All elements containing an '_' filtering out those starting by chapter_id_ and not having their parent the class available.
var $availableNonChapterElements = $("h2[id*='_']").filter(function(i, element) {
return !element.id.match(/^chapter_id_/) && $(element).parent().hasClass('available');
});
$availableChapters.each(function(i, chapter) {
var chapterNumber = chapter.id.split(/_/).pop();
var livebookUrl = "https://livebook.manning.com/book/the-creative-programmer/chapter-" + chapterNumber;
wrapTocWithLink(chapter, livebookUrl, chapterNumber);
});
var isSingleAppendix = $("h2[id*='_']").filter(function(i, element) {
return !element.id.match(/^chapter_id_/) ;
}).length === 1;
$availableNonChapterElements.each(function(i, appendix) {
var appendixGroups = appendix.textContent.match(/[aA]ppendix (\w)/); // i.e "Appendix A: Installation => ['Appendix A', 'A', index:0, input: 'Appendix A: Installation']
var section = isSingleAppendix ? 'a' : appendixGroups && appendixGroups.length === 2 && appendixGroups[1].toLowerCase();
var appendixPathName = isSingleAppendix ? 'appendix' : 'appendix-' + section;
var livebookUrl = "https://livebook.manning.com/book/the-creative-programmer/" + appendixPathName;
wrapTocWithLink(appendix, livebookUrl, section);
});
var $availableMiscElements = $("h2[id='foreword'], h2[id='preface'], h2[id='epilogue']").filter(function(i, element) {
return $(element).parent().hasClass('available');
});
$availableMiscElements.each(function(i, miscElement){
var livebookUrl = "https://livebook.manning.com/book/the-creative-programmer/" + $(miscElement).attr("id");
wrapTocWithLink(miscElement, livebookUrl, "");
});
$('[data-toggle="tooltip"]').tooltip();
}
var addToWishlistUrl = "/wishList/addItemFromPage" + "?";
var removeFromWishlistUrl = "/wishList/removeItemFromPage" + "?";
$("body").on("click", ".wishlist-login", function() {
localStorage.removeItem('dynamicloadcache');
});
$("body").on("click", ".wishlist-toggle.wishlist-add, .wishlist-toggle.wishlist-remove", function() {
var productId = $(this).data("product-id");
var url = addToWishlistUrl;
if ($(this).hasClass("wishlist-remove")) {
url = removeFromWishlistUrl;
$(".wishlist-container").removeClass("on-wishlist");
} else {
$(".wishlist-container").addClass("on-wishlist");
}
$.ajax({
type: "GET",
url: url + "id=" + productId,
timeout: 3000,
dataType: "json",
headers: {
'accept': "application/json"
}
});
});
$(document).trigger('activity-product-browse', {productId: '2544'});
})(jQuery);
}