scriptorium 0.6.1 → 0.7.2
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/icons/social/reddit.png +0 -0
- data/assets/icons/social/x-logo.png +0 -0
- data/assets/imagenotfound.jpg +0 -0
- data/bin/sblog +84 -5
- data/bin/scriptorium +1 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +0 -1
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +0 -29
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +0 -19
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +1 -1
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +1 -1
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +1 -1
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +0 -10
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +1 -4
- data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
- data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
- data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
- data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
- data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
- data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
- data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
- data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
- data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
- data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
- data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
- data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
- data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
- data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
- data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
- data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
- data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
- data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
- data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
- data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
- data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
- data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
- data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
- data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
- data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
- data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
- data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
- data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
- data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
- data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
- data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
- data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
- data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
- data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
- data/doc/imported/0018-ruby-puns/post.html +46 -0
- data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
- data/doc/imported/0020-fffff/metadata.txt +7 -0
- data/doc/imported/0020-fffff/post.html +24 -0
- data/doc/imported/0020-fffff/source.lt3 +12 -0
- data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
- data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
- data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
- data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
- data/doc/imported/0023-doctor-sleep/post.html +63 -0
- data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
- data/doc/imported/0024-just-a-test/metadata.txt +7 -0
- data/doc/imported/0024-just-a-test/post.html +24 -0
- data/doc/imported/0024-just-a-test/source.lt3 +12 -0
- data/doc/imported/import_summary.txt +98 -0
- data/doc/livetext-informal-spec.txt +65 -0
- data/doc/myuserdoc/ch-0.lt3 +31 -0
- data/doc/myuserdoc/ch-1.lt3 +37 -0
- data/doc/myuserdoc/ch-10.lt3 +22 -0
- data/doc/myuserdoc/ch-2.lt3 +37 -0
- data/doc/myuserdoc/ch-3.lt3 +19 -0
- data/doc/myuserdoc/ch-4.lt3 +43 -0
- data/doc/myuserdoc/ch-5.lt3 +22 -0
- data/doc/myuserdoc/ch-6.lt3 +19 -0
- data/doc/myuserdoc/ch-7.lt3 +16 -0
- data/doc/myuserdoc/ch-8.lt3 +13 -0
- data/doc/myuserdoc/ch-9.lt3 +19 -0
- data/doc/myuserdoc/tweak.rb +18 -0
- data/doc/{userdoc-toc.txt → myuserdoc/userdoc-toc.txt} +27 -27
- data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
- data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
- data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
- data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
- data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
- data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
- data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
- data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
- data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
- data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
- data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
- data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
- data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
- data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
- data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
- data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
- data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
- data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
- data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
- data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
- data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
- data/doc/old-posts/0024-just-a-test.lt3 +12 -0
- data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
- data/doc/old-repo +1 -0
- data/doc/reddit_integration.md +2 -2
- data/doc/user.lt3 +0 -3
- data/lib/scriptorium/api.rb +1811 -78
- data/lib/scriptorium/banner_svg.rb +55 -68
- data/lib/scriptorium/contract.rb +3 -2
- data/lib/scriptorium/exceptions.rb +133 -102
- data/lib/scriptorium/helpers.rb +282 -82
- data/lib/scriptorium/post.rb +81 -17
- data/lib/scriptorium/reddit.rb +1 -1
- data/lib/scriptorium/repo.rb +478 -164
- data/lib/scriptorium/standard_files.rb +30 -396
- data/lib/scriptorium/support/common_js/clipboard.js +35 -0
- data/lib/scriptorium/support/common_js/content-loader.js +187 -0
- data/lib/scriptorium/support/common_js/navigation.js +52 -0
- data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
- data/lib/scriptorium/support/config/reddit_template.txt +17 -0
- data/{test/scriptorium-TEST-1754622690-146/views/sample → lib/scriptorium/support}/config/social.txt +1 -0
- data/lib/scriptorium/support/highlight/css.txt +2 -0
- data/lib/scriptorium/support/highlight/custom.css +119 -0
- data/lib/scriptorium/support/highlight/js.txt +1 -0
- data/lib/scriptorium/support/post_index/config.txt +15 -0
- data/lib/scriptorium/support/post_index/style.css +55 -0
- data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
- data/{test/scriptorium-TEST-1754622690-146/themes/standard/initial/post.lt3 → lib/scriptorium/support/templates/initial_post.lt3} +5 -5
- data/lib/scriptorium/support/templates/post.lt3 +104 -0
- data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/header.txt → lib/scriptorium/support/theme/header.lt3} +1 -1
- data/lib/scriptorium/theme.rb +83 -70
- data/lib/scriptorium/version.rb +2 -2
- data/lib/scriptorium/view.rb +194 -149
- data/lib/scriptorium.rb +24 -1
- data/lib/skeleton.rb +4 -1
- data/scriptorium.gemspec +2 -1
- data/test/WEB_INTEGRATION_README.md +196 -0
- data/test/all +40 -0
- data/test/banner_svg/unit.rb +267 -35
- data/test/config/deployment.txt +5 -0
- data/test/integration/integration_test.rb +7 -7
- data/test/integration/preview_flow_test.rb +94 -0
- data/test/livetext_plugin_test.rb +453 -182
- data/test/manual/banner-tests/test01.html +82 -18
- data/test/manual/banner-tests/test02.html +82 -18
- data/test/manual/banner-tests/test03.html +82 -18
- data/test/manual/banner-tests/test04.html +89 -25
- data/test/manual/banner-tests/test05.html +89 -25
- data/test/manual/banner-tests/test06.html +89 -25
- data/test/manual/banner-tests/test07.html +89 -25
- data/test/manual/banner-tests/test08.html +82 -18
- data/test/manual/banner-tests/test09.html +82 -18
- data/test/manual/banner-tests/test10.html +82 -18
- data/test/manual/banner-tests/test11.html +82 -18
- data/test/manual/banner-tests/test12.html +82 -18
- data/test/manual/banner-tests/test13.html +82 -18
- data/test/manual/banner-tests/test14.html +82 -18
- data/test/manual/banner-tests/test15.html +82 -18
- data/test/manual/banner-tests/test16.html +82 -18
- data/test/manual/banner-tests/test17.html +82 -18
- data/test/manual/banner-tests/test18.html +90 -26
- data/test/manual/banner-tests/test19.html +90 -26
- data/test/manual/banner-tests/test20.html +90 -26
- data/test/manual/banner-tests/test21.html +90 -26
- data/test/manual/banner-tests/test22.html +90 -26
- data/test/manual/banner-tests/test23.html +90 -26
- data/test/manual/banner-tests/test24.html +90 -26
- data/test/manual/banner-tests/test25.html +89 -25
- data/test/manual/banner_environment.rb +15 -2
- data/test/manual/codemirror_demo.html +773 -0
- data/test/manual/create_posts_for_web.rb +114 -0
- data/test/manual/preview_manual_test.rb +129 -0
- data/test/manual/test_banner_features.rb +14 -14
- data/test/manual/test_banner_integration.rb +115 -0
- data/test/manual/test_banner_radial.rb +87 -0
- data/test/manual/test_syntax_highlighting.rb +60 -40
- data/test/support/preview_utils.rb +88 -0
- data/test/test_gem_assets.rb +48 -0
- data/test/test_helpers.rb +10 -0
- data/test/tui_editor_integration_test.rb +15 -15
- data/test/tui_integration_test.rb +687 -441
- data/test/unit/api.rb +757 -37
- data/test/unit/asset_management.rb +195 -221
- data/test/unit/backup_test.rb +451 -0
- data/test/unit/contract_test.rb +1 -23
- data/test/unit/core.rb +415 -61
- data/test/unit/deploy_config_test.rb +248 -0
- data/test/unit/deploy_test.rb +312 -21
- data/test/unit/edit_post_test.rb +168 -0
- data/test/unit/gem_asset_management.rb +36 -42
- data/test/unit/livetext_basic.rb +23 -35
- data/test/unit/livetext_compatibility.rb +7 -14
- data/test/unit/parse_cmd_test.rb +260 -0
- data/test/unit/{symlink_test.rb → permalink_copy_test.rb} +47 -49
- data/test/unit/post.rb +91 -26
- data/test/unit/post_index_config_test.rb +258 -0
- data/test/unit/post_state_helpers_test.rb +137 -0
- data/test/unit/read_commented_file_test.rb +8 -6
- data/test/unit/repo.rb +75 -54
- data/test/unit/social_test.rb +41 -44
- data/test/unit/syntax_highlighting.rb +70 -0
- data/test/unit/theme_management_test.rb +91 -0
- data/test/unit/view.rb +79 -12
- data/test/unit/widgets.rb +8 -8
- data/test/web_integration_test.rb +231 -0
- data/test/web_test_helper.rb +218 -0
- data/test/web_workflow_test.rb +527 -0
- data/ui/tui/bin/scriptorium +885 -415
- data/ui/web/app/app.rb +1398 -176
- data/ui/web/app/assets/livetext_mode.js +244 -0
- data/ui/web/app/error_helpers.rb +16 -16
- data/ui/web/app/views/advanced_config.erb +8 -2
- data/ui/web/app/views/asset_management.erb +56 -0
- data/ui/web/app/views/backup_management.erb +238 -0
- data/ui/web/app/views/config_widget.erb +232 -0
- data/ui/web/app/views/dashboard.erb +64 -72
- data/ui/web/app/views/deploy_config.erb +3 -0
- data/ui/web/app/views/edit_pages.erb +170 -2
- data/ui/web/app/views/edit_post.erb +130 -9
- data/ui/web/app/views/edit_theme.erb +73 -0
- data/ui/web/app/views/edit_theme_file.erb +74 -0
- data/ui/web/app/views/theme_management.erb +130 -0
- data/ui/web/app/views/view_dashboard.erb +666 -25
- data/ui/web/app/views/widgets.erb +249 -0
- data/ui/web/bin/scriptorium-web +35 -24
- data/ui/web/tmp/timing.log +17 -0
- data/ui/web/tmp/web_server.log +0 -5
- metadata +190 -116
- data/assets/back-icon.png +0 -0
- data/assets/icons/facebook.svg +0 -1
- data/assets/icons/github.svg +0 -1
- data/assets/icons/instagram.svg +0 -1
- data/assets/icons/reddit.svg +0 -1
- data/assets/icons/x.svg +0 -1
- data/assets/icons/youtube.svg +0 -1
- data/bin/scriptorium +0 -1511
- data/doc/anti-amnesia/20250727-060000-api-design-tui-planning.md +0 -34
- data/doc/anti-amnesia/20250727-061000-runeblog-tui-analysis.md +0 -50
- data/doc/anti-amnesia/20250727-154000-livetext-plugin-file-stats.md +0 -73
- data/doc/anti-amnesia/20250727-172600-unified-minitest-framework.md +0 -70
- data/doc/anti-amnesia/20250727-173000-widget-testing-achievement.md +0 -110
- data/doc/anti-amnesia/20250727-180000-post-id-num-refactoring.md +0 -73
- data/doc/anti-amnesia/20250728-124421-conversation-summary-concise.md +0 -124
- data/doc/anti-amnesia/20250729-190000-scriptorium-tui-testing-complete.md +0 -46
- data/doc/anti-amnesia/20250729-200000-scriptorium-tui-testing-edit-file-workflow.md +0 -97
- data/doc/anti-amnesia/20250729-211500-dependency-management-system.md +0 -211
- data/doc/anti-amnesia/20250729-213000-python-virtual-environment-setup.md +0 -141
- data/doc/anti-amnesia/20250729-214500-theme-management-commands.md +0 -211
- data/doc/anti-amnesia/20250729-215000-version-update-to-0.6.0.md +0 -134
- data/doc/anti-amnesia/20250729-220000-user-guide-complete.md +0 -41
- data/doc/anti-amnesia/20250804-213700-publishing-test-fix.md +0 -49
- data/doc/anti-amnesia/20250804-214400-additional-test-fixes.md +0 -46
- data/doc/anti-amnesia/20250804-220000-asset-function-logic-clarification.md +0 -41
- data/doc/anti-amnesia/20250806-202032-asset-function-logic-clarification.md +0 -41
- data/doc/anti-amnesia/20250813-082428-syntax-highlighting-and-navigation-improvements.md +0 -256
- data/lib/scriptorium/syntax_highlighter.rb +0 -234
- data/test/manual/deploy_symlink_demo.rb +0 -142
- data/test/manual/symlink_demo.rb +0 -117
- data/test/manual/test2.rb +0 -12
- data/test/manual/test_banner_from_file.rb +0 -150
- data/test/manual/test_banner_in_header.rb +0 -35
- data/test/manual/test_code_highlighting.rb +0 -68
- data/test/manual/test_complex_header.rb +0 -74
- data/test/manual/test_empty_header.rb +0 -32
- data/test/manual/test_radial_custom.rb +0 -58
- data/test/manual/test_radial_large_radius.rb +0 -52
- data/test/manual/test_svg_debug.rb +0 -47
- data/test/pages-demo/config/currentview.txt +0 -1
- data/test/pages-demo/views/demo/config/common.js +0 -57
- data/test/pages-demo/views/demo/config/footer.txt +0 -1
- data/test/pages-demo/views/demo/config/global-head.txt +0 -8
- data/test/pages-demo/views/demo/config/header.txt +0 -1
- data/test/pages-demo/views/demo/config/layout.txt +0 -1
- data/test/pages-demo/views/demo/config/left.txt +0 -1
- data/test/pages-demo/views/demo/config/main.txt +0 -1
- data/test/pages-demo/views/demo/config/right.txt +0 -1
- data/test/pages-demo/views/demo/config.txt +0 -3
- data/test/pages-demo/views/demo/output/panes/footer.html +0 -1
- data/test/pages-demo/views/demo/output/panes/header.html +0 -1
- data/test/pages-demo/views/demo/output/panes/left.html +0 -1
- data/test/pages-demo/views/demo/output/panes/main.html +0 -1
- data/test/pages-demo/views/demo/output/panes/right.html +0 -1
- data/test/scriptorium-TEST-1754622690-146/config/bootstrap_css.txt +0 -5
- data/test/scriptorium-TEST-1754622690-146/config/bootstrap_js.txt +0 -4
- data/test/scriptorium-TEST-1754622690-146/config/common.js +0 -57
- data/test/scriptorium-TEST-1754622690-146/config/currentview.txt +0 -1
- data/test/scriptorium-TEST-1754622690-146/config/global-head.txt +0 -9
- data/test/scriptorium-TEST-1754622690-146/config/last_post_num.txt +0 -1
- data/test/scriptorium-TEST-1754622690-146/config/os_helpers.rb +0 -4
- data/test/scriptorium-TEST-1754622690-146/config/widgets.txt +0 -3
- data/test/scriptorium-TEST-1754622690-146/posts/0001/meta.txt +0 -8
- data/test/scriptorium-TEST-1754622690-146/posts/0001/source.lt3 +0 -6
- data/test/scriptorium-TEST-1754622690-146/themes/standard/README.txt +0 -1
- data/test/scriptorium-TEST-1754622690-146/themes/standard/config.txt +0 -1
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/gen/text.css +0 -1
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index.lt3 +0 -1
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index_entry.lt3 +0 -14
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/post.lt3 +0 -13
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/widget.lt3 +0 -1
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_css.txt +0 -5
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_js.txt +0 -4
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/common.js +0 -57
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/deploy.txt +0 -5
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/footer.txt +0 -2
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/global-head.txt +0 -9
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/header.txt +0 -4
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/layout.txt +0 -5
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/left.txt +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/main.txt +0 -5
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/right.txt +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/status.txt +0 -7
- data/test/scriptorium-TEST-1754622690-146/views/sample/config.txt +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/footer.html +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/header.html +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/left.html +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/main.html +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/right.html +0 -3
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/footer.html +0 -1
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/header.html +0 -1
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/left.html +0 -1
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/main.html +0 -1
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/right.html +0 -1
- data/ui/web/tmp/web_server.pid +0 -1
- /data/{test/pages-demo/views/demo/config/bootstrap_css.txt → lib/scriptorium/support/bootstrap/css.txt} +0 -0
- /data/{test/pages-demo/views/demo/config/bootstrap_js.txt → lib/scriptorium/support/bootstrap/js.txt} +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/views/sample → lib/scriptorium/support}/config/reddit.txt +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout → lib/scriptorium/support/templates}/layout.txt +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/footer.txt → lib/scriptorium/support/theme/footer.lt3} +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/left.txt → lib/scriptorium/support/theme/left.lt3} +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/main.txt → lib/scriptorium/support/theme/main.lt3} +0 -0
- /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/right.txt → lib/scriptorium/support/theme/right.lt3} +0 -0
- /data/test/manual/banner-tests/{config.txt → svg.txt} +0 -0
- /data/test/manual/{test6.rb → test_advanced_widgets.rb} +0 -0
- /data/test/manual/{test1.rb → test_basic_posts.rb} +0 -0
- /data/test/manual/{test4.rb → test_layout_widgets.rb} +0 -0
- /data/test/manual/{test5.rb → test_pagination.rb} +0 -0
- /data/test/manual/{test3.rb → test_random_posts.rb} +0 -0
@@ -0,0 +1,175 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Immutable data (ditching the wax tablet)</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Immutable data (ditching the wax tablet)">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-08-25">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Immutable data (ditching the wax tablet)</h1>
|
16
|
+
<time datetime="2015-08-25">August 25, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
A couple of weeks ago, I went to Phoenix training prior to the Lone Star Ruby
|
22
|
+
Conference in Austin. I was talking with Bruce Tate, and he shared with me
|
23
|
+
some thoughts about functional programming in general.
|
24
|
+
Obviously Bruce isn't responsible if I misquote him. My memory is faulty.
|
25
|
+
|
26
|
+
<p>
|
27
|
+
"Functional programming is the future," he told me, "and OOP is dying."
|
28
|
+
He pointed to the ever-increasing popularity of multi-core machines and the
|
29
|
+
increasing irrelevance of conserving memory.
|
30
|
+
|
31
|
+
<p>
|
32
|
+
He said that OOP was all about optimizing for memory usage, and that was
|
33
|
+
no longer such a big concern. I wasn't sure what he meant. I thought about it
|
34
|
+
later, and decided I was probably missing some profound points.
|
35
|
+
|
36
|
+
<p>
|
37
|
+
But at the same time, I thought I saw something with a clarity that I hadn't
|
38
|
+
before. I have wrestled with the concepts of FP over the last year or two; as
|
39
|
+
a procedural and OOP type, it hasn't always fit into my brain quickly or
|
40
|
+
easily.
|
41
|
+
|
42
|
+
<p>
|
43
|
+
At times it felt that I was taking a step backwards technologically, back into
|
44
|
+
procedural thinking. On the one hand, that isn't really true. On the other
|
45
|
+
hand, I think we all know what backtracking is for. If you've ever gotten lost
|
46
|
+
in a strange town, you know that sometimes you have to back up to a known
|
47
|
+
point and try going off in a different direction.
|
48
|
+
|
49
|
+
<p>
|
50
|
+
If you're interested, you could make some fine analogies here between human
|
51
|
+
technological advances and things like game theory and machine learning. It's
|
52
|
+
hard to imagine navigating a maze or implementing a chess-playing program
|
53
|
+
without the concept of backtracking. But that's not my point here.
|
54
|
+
|
55
|
+
<p>
|
56
|
+
One of the key concepts in functional programming, as I understand it, is that
|
57
|
+
of immutable data. I have spent hours puzzling over this, because it hasn't
|
58
|
+
been immediately intuitive to me.
|
59
|
+
|
60
|
+
<p>
|
61
|
+
There was a quote I read once that the GOTO statement caused difficulties
|
62
|
+
because it left us with the question, "How did I get here?" And mutable data
|
63
|
+
leaves us with the question, "How did I get to this state?" That made sense
|
64
|
+
to me, at least a little.
|
65
|
+
|
66
|
+
<p>
|
67
|
+
It got me to thinking about a more remote time, when I taught programming
|
68
|
+
concepts to beginners (using BASIC). In an effort to explain how a program
|
69
|
+
worked, I would run through an exercise on the whiteboard which I called
|
70
|
+
"playing computer." Variables were represented by little boxes which more or
|
71
|
+
less corresponded to memory locations. As I manually stepped through the execution
|
72
|
+
of some simple program, I would erase and update the contents of these boxes.
|
73
|
+
|
74
|
+
<p>
|
75
|
+
It was nice and effective, but I sometimes did it another way. I expressed the
|
76
|
+
same information in the form of a table, with variable names across the
|
77
|
+
columns and time increasing down the rows. This made it clear not just what
|
78
|
+
values the variables had, but what values they used to have (and how/when they
|
79
|
+
changed).
|
80
|
+
|
81
|
+
<p>
|
82
|
+
As an aside, I'm one of those people who believes that an education should not
|
83
|
+
be merely deep but also broad. I believe a good vocabulary, like a good
|
84
|
+
education in general, enhances our experience of life.
|
85
|
+
|
86
|
+
<p>
|
87
|
+
And as I thought about my old whiteboard shenanigans, the word that came to me
|
88
|
+
was <i>palimpsest</i> -- a beautiful, useful, poetic word that we rarely see nowadays.
|
89
|
+
It's sometimes used figuratively; but the literal definition is <i>(a</i> document on )
|
90
|
+
<i>(which</i> the original writing has been erased and replaced with new writing).
|
91
|
+
|
92
|
+
<p>
|
93
|
+
I thought about the many older modes of writing, such as clay and wax tablets
|
94
|
+
and papyrus. Some materials such as papyrus and parchment (vellum) were rather
|
95
|
+
limited in availability or moderately labor-intensive to produce; people wanted
|
96
|
+
to re-use them. It was natural to wipe (or scrape or clean) such a material
|
97
|
+
once the writing on it was no longer relevant. The term "blank slate" <i>((tabula</i> rasa))
|
98
|
+
was once very literal; the stuff we wrote on was the same as the building material.
|
99
|
+
|
100
|
+
<p>
|
101
|
+
By the way, what is deemed relevant may change over the course of 1,000 or 2,000
|
102
|
+
years. Many an archaeologist or linguist has spent countless frustrating hours
|
103
|
+
trying to decipher the original writing under some later inscription. In a
|
104
|
+
similar way, art experts have gone to enormous lengths to uncover artworks
|
105
|
+
which someone painted over rather than start a new canvas.
|
106
|
+
|
107
|
+
<p>
|
108
|
+
But what if writing materials were cheap? Today we are much more likely to
|
109
|
+
have notepads on our desks than little erasable slates or wax tablets.
|
110
|
+
|
111
|
+
<p>
|
112
|
+
Let's extend the analogy to computer memory. There was a time, perhaps four
|
113
|
+
decades ago, when it was expensive and limited in availabilty. I recall seeing
|
114
|
+
an information sheet about a mainframe ("What's a mainframe?" asks everyone
|
115
|
+
under 40) that listed its specs, almost bragging about its memory, which was
|
116
|
+
448K. Yes, that is less than half a meg. That computer ran a medium-sized
|
117
|
+
university. Within seven years, of course, people were carrying around floppy
|
118
|
+
disks that held three times that much. ("What's a floppy disk?" asks everyone
|
119
|
+
under 30.)
|
120
|
+
|
121
|
+
<p>
|
122
|
+
It was only ten years or so prior to that time that the world saw the creation
|
123
|
+
of this curious thing called UNIX (a play on the name MULTICS). Some of you
|
124
|
+
reading this may have wondered (or not) why UNIX and its offspring stored a
|
125
|
+
conceptual newline as a single linefeed character (rather than the somewhat
|
126
|
+
more sensible "carriage return + linefeed" combination. The answer is that
|
127
|
+
the designers wanted to save RAM and disk space. For every line of text, they
|
128
|
+
saved an entire byte in this way. When a linefeed was sent to a device such
|
129
|
+
as a terminal or printer, the OS typically converted it to a "real" CRLF pair.
|
130
|
+
This all happened because memory was scarce and expensive.
|
131
|
+
|
132
|
+
<p>
|
133
|
+
It isn't true anymore. In some cases, we may have learned bad habits and
|
134
|
+
forgotten how to conserve memory. But in general, we have more imortant things
|
135
|
+
to worry about now.
|
136
|
+
|
137
|
+
<p>
|
138
|
+
But let's think a minute. If memory is cheap and available, why are we
|
139
|
+
turning it into a palimpsest? Isn't there something to be said for the idea of
|
140
|
+
leaving data alone, never overwriting information, always writing new data
|
141
|
+
somewhere else?
|
142
|
+
|
143
|
+
<p>
|
144
|
+
If we do that, we have a "history" of what has happened in program execution,
|
145
|
+
like a trail of breadcrumbs. More importantly, pieces of code that run
|
146
|
+
concurrently need not worry about stepping on each other's data. One process
|
147
|
+
(or thread or fiber) will never write over an item that another process is
|
148
|
+
reading. If this doesn't eliminate synchronization issues, it at least
|
149
|
+
mitigates them greatly.
|
150
|
+
|
151
|
+
<p>
|
152
|
+
So I'm starting to see where immutable data could be a good thing. And I'm
|
153
|
+
starting to see how it's good for concurrency. And concurrency really matters,
|
154
|
+
because it is the limiting factor of this generation of computing just as
|
155
|
+
memory scarcity was a limiting factor one or two generations ago.
|
156
|
+
|
157
|
+
<p>
|
158
|
+
In fact, I'll speculate a little about memory in general. Let's look 10, 20,
|
159
|
+
or even 50 years into the future. (My crystal ball, like everyone else's, is
|
160
|
+
very cloudy.)
|
161
|
+
|
162
|
+
<p>
|
163
|
+
I can imagine a time when memory is simply never erased at all. We're seeing
|
164
|
+
the crude beginnings of this already. Source control systems and databases
|
165
|
+
preserve far more history than they used to. My laptop's OS encourages me to
|
166
|
+
think of my backed-up data as a sort of limitless archive of past versions of
|
167
|
+
files. It's mostly an illusion, but it needn't always be. Why should any
|
168
|
+
document, any image, any video ever be erased?
|
169
|
+
|
170
|
+
<p>
|
171
|
+
Food for thought. Chow down, friends.
|
172
|
+
</div>
|
173
|
+
</article>
|
174
|
+
</body>
|
175
|
+
</html>
|
@@ -0,0 +1,139 @@
|
|
1
|
+
.h1 Immutable data (ditching the wax tablet)
|
2
|
+
|
3
|
+
.set post.num = 0010
|
4
|
+
.set post.slug = immutable-data-ditching-the-wax-tablet
|
5
|
+
.set post.date = 2015-08-25
|
6
|
+
.set post.title = Immutable data (ditching the wax tablet)
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
A couple of weeks ago, I went to Phoenix training prior to the Lone Star Ruby
|
13
|
+
Conference in Austin. I was talking with Bruce Tate, and he shared with me
|
14
|
+
some thoughts about functional programming in general.
|
15
|
+
Obviously Bruce isn't responsible if I misquote him. My memory is faulty.
|
16
|
+
|
17
|
+
"Functional programming is the future," he told me, "and OOP is dying."
|
18
|
+
He pointed to the ever-increasing popularity of multi-core machines and the
|
19
|
+
increasing irrelevance of conserving memory.
|
20
|
+
|
21
|
+
He said that OOP was all about optimizing for memory usage, and that was
|
22
|
+
no longer such a big concern. I wasn't sure what he meant. I thought about it
|
23
|
+
later, and decided I was probably missing some profound points.
|
24
|
+
|
25
|
+
But at the same time, I thought I saw something with a clarity that I hadn't
|
26
|
+
before. I have wrestled with the concepts of FP over the last year or two; as
|
27
|
+
a procedural and OOP type, it hasn't always fit into my brain quickly or
|
28
|
+
easily.
|
29
|
+
|
30
|
+
At times it felt that I was taking a step backwards technologically, back into
|
31
|
+
procedural thinking. On the one hand, that isn't really true. On the other
|
32
|
+
hand, I think we all know what backtracking is for. If you've ever gotten lost
|
33
|
+
in a strange town, you know that sometimes you have to back up to a known
|
34
|
+
point and try going off in a different direction.
|
35
|
+
|
36
|
+
If you're interested, you could make some fine analogies here between human
|
37
|
+
technological advances and things like game theory and machine learning. It's
|
38
|
+
hard to imagine navigating a maze or implementing a chess-playing program
|
39
|
+
without the concept of backtracking. But that's not my point here.
|
40
|
+
|
41
|
+
One of the key concepts in functional programming, as I understand it, is that
|
42
|
+
of immutable data. I have spent hours puzzling over this, because it hasn't
|
43
|
+
been immediately intuitive to me.
|
44
|
+
|
45
|
+
There was a quote I read once that the GOTO statement caused difficulties
|
46
|
+
because it left us with the question, "How did I get here?" And mutable data
|
47
|
+
leaves us with the question, "How did I get to this state?" That made sense
|
48
|
+
to me, at least a little.
|
49
|
+
|
50
|
+
It got me to thinking about a more remote time, when I taught programming
|
51
|
+
concepts to beginners (using BASIC). In an effort to explain how a program
|
52
|
+
worked, I would run through an exercise on the whiteboard which I called
|
53
|
+
"playing computer." Variables were represented by little boxes which more or
|
54
|
+
less corresponded to memory locations. As I manually stepped through the execution
|
55
|
+
of some simple program, I would erase and update the contents of these boxes.
|
56
|
+
|
57
|
+
It was nice and effective, but I sometimes did it another way. I expressed the
|
58
|
+
same information in the form of a table, with variable names across the
|
59
|
+
columns and time increasing down the rows. This made it clear not just what
|
60
|
+
values the variables had, but what values they used to have (and how/when they
|
61
|
+
changed).
|
62
|
+
|
63
|
+
As an aside, I'm one of those people who believes that an education should not
|
64
|
+
be merely deep but also broad. I believe a good vocabulary, like a good
|
65
|
+
education in general, enhances our experience of life.
|
66
|
+
|
67
|
+
And as I thought about my old whiteboard shenanigans, the word that came to me
|
68
|
+
was palimpsest -- a beautiful, useful, poetic word that we rarely see nowadays.
|
69
|
+
It's sometimes used figuratively; but the literal definition is (a document on )
|
70
|
+
(which the original writing has been erased and replaced with new writing).
|
71
|
+
|
72
|
+
I thought about the many older modes of writing, such as clay and wax tablets
|
73
|
+
and papyrus. Some materials such as papyrus and parchment (vellum) were rather
|
74
|
+
limited in availability or moderately labor-intensive to produce; people wanted
|
75
|
+
to re-use them. It was natural to wipe (or scrape or clean) such a material
|
76
|
+
once the writing on it was no longer relevant. The term "blank slate" ((tabula rasa))
|
77
|
+
was once very literal; the stuff we wrote on was the same as the building material.
|
78
|
+
|
79
|
+
By the way, what is deemed relevant may change over the course of 1,000 or 2,000
|
80
|
+
years. Many an archaeologist or linguist has spent countless frustrating hours
|
81
|
+
trying to decipher the original writing under some later inscription. In a
|
82
|
+
similar way, art experts have gone to enormous lengths to uncover artworks
|
83
|
+
which someone painted over rather than start a new canvas.
|
84
|
+
|
85
|
+
But what if writing materials were cheap? Today we are much more likely to
|
86
|
+
have notepads on our desks than little erasable slates or wax tablets.
|
87
|
+
|
88
|
+
Let's extend the analogy to computer memory. There was a time, perhaps four
|
89
|
+
decades ago, when it was expensive and limited in availabilty. I recall seeing
|
90
|
+
an information sheet about a mainframe ("What's a mainframe?" asks everyone
|
91
|
+
under 40) that listed its specs, almost bragging about its memory, which was
|
92
|
+
448K. Yes, that is less than half a meg. That computer ran a medium-sized
|
93
|
+
university. Within seven years, of course, people were carrying around floppy
|
94
|
+
disks that held three times that much. ("What's a floppy disk?" asks everyone
|
95
|
+
under 30.)
|
96
|
+
|
97
|
+
It was only ten years or so prior to that time that the world saw the creation
|
98
|
+
of this curious thing called UNIX (a play on the name MULTICS). Some of you
|
99
|
+
reading this may have wondered (or not) why UNIX and its offspring stored a
|
100
|
+
conceptual newline as a single linefeed character (rather than the somewhat
|
101
|
+
more sensible "carriage return + linefeed" combination. The answer is that
|
102
|
+
the designers wanted to save RAM and disk space. For every line of text, they
|
103
|
+
saved an entire byte in this way. When a linefeed was sent to a device such
|
104
|
+
as a terminal or printer, the OS typically converted it to a "real" CRLF pair.
|
105
|
+
This all happened because memory was scarce and expensive.
|
106
|
+
|
107
|
+
It isn't true anymore. In some cases, we may have learned bad habits and
|
108
|
+
forgotten how to conserve memory. But in general, we have more imortant things
|
109
|
+
to worry about now.
|
110
|
+
|
111
|
+
But let's think a minute. If memory is cheap and available, why are we
|
112
|
+
turning it into a palimpsest? Isn't there something to be said for the idea of
|
113
|
+
leaving data alone, never overwriting information, always writing new data
|
114
|
+
somewhere else?
|
115
|
+
|
116
|
+
If we do that, we have a "history" of what has happened in program execution,
|
117
|
+
like a trail of breadcrumbs. More importantly, pieces of code that run
|
118
|
+
concurrently need not worry about stepping on each other's data. One process
|
119
|
+
(or thread or fiber) will never write over an item that another process is
|
120
|
+
reading. If this doesn't eliminate synchronization issues, it at least
|
121
|
+
mitigates them greatly.
|
122
|
+
|
123
|
+
So I'm starting to see where immutable data could be a good thing. And I'm
|
124
|
+
starting to see how it's good for concurrency. And concurrency really matters,
|
125
|
+
because it is the limiting factor of this generation of computing just as
|
126
|
+
memory scarcity was a limiting factor one or two generations ago.
|
127
|
+
|
128
|
+
In fact, I'll speculate a little about memory in general. Let's look 10, 20,
|
129
|
+
or even 50 years into the future. (My crystal ball, like everyone else's, is
|
130
|
+
very cloudy.)
|
131
|
+
|
132
|
+
I can imagine a time when memory is simply never erased at all. We're seeing
|
133
|
+
the crude beginnings of this already. Source control systems and databases
|
134
|
+
preserve far more history than they used to. My laptop's OS encourages me to
|
135
|
+
think of my backed-up data as a sort of limitless archive of past versions of
|
136
|
+
files. It's mostly an illusion, but it needn't always be. Why should any
|
137
|
+
document, any image, any video ever be erased?
|
138
|
+
|
139
|
+
Food for thought. Chow down, friends.
|
@@ -0,0 +1,139 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Computer science as a lost art</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Computer science as a lost art">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-09-17">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Computer science as a lost art</h1>
|
16
|
+
<time datetime="2015-09-17">September 17, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
An old friend of mine asked me this in email last night...
|
22
|
+
<blockquote>
|
23
|
+
Thanks for taking the time here. My younger son is interested in pursuing a career in computer science. He's a freshman at Kennesaw State right now, but he really struggles with the idea of taking two years of classes that he has very little interest in. There are three schools in Atlanta with 8- to 16-week full-day immersive courses that focus solely on technology: The Iron Yard, Digital Crafts, and General Assembly. In the world of computer science, what is the opinion is of programs like this? Is a 4-year degree viewed as more valuable?
|
24
|
+
</blockquote>
|
25
|
+
<b>This morning, this was my off-the-cuff answer:</b>
|
26
|
+
|
27
|
+
<p>
|
28
|
+
Well, here is my opinion... I'm speaking as someone with two degrees and
|
29
|
+
therefore six years in comp sci, as well as 30 years' experience. In other words,
|
30
|
+
I'm old-fashioned, a freaking dinosaur. :)
|
31
|
+
|
32
|
+
<p>
|
33
|
+
There is a whole generation of computer people who are very different from the
|
34
|
+
previous generation. CS used to be (and really still is) a very deep and demanding
|
35
|
+
field.
|
36
|
+
|
37
|
+
<p>
|
38
|
+
But two or three things have happened. First of all, computers are pretty much
|
39
|
+
universal now. Do you know anyone under 80 who doesn't have one? Second, the
|
40
|
+
World Wide Web (born in 1989 as a "face" on the more bare-bones Internet)
|
41
|
+
started being invaded by the general public in 1995 or so. As usage became more
|
42
|
+
common, it became more important to everyday life. And third, the tools we use
|
43
|
+
to create applications have gotten a bit more sophisticated. It's easier to use these
|
44
|
+
tools, just as it's easier to drive a car now than it was in 1905.
|
45
|
+
|
46
|
+
<p>
|
47
|
+
What all this means is that there are more kinds of "computer person" than there
|
48
|
+
ever were before. There are many thousands of "programmers" who never took
|
49
|
+
a programming course. This is both good and bad.
|
50
|
+
|
51
|
+
<p>
|
52
|
+
It means that a person can get the little things done while knowing very little. But it
|
53
|
+
also means that this person probably will never learn enough to get the big things done.
|
54
|
+
|
55
|
+
<p>
|
56
|
+
To be honest, I get secretly frustrated with the lower-level people who now exist
|
57
|
+
in giant hordes. (I rarely tell anyone that.) To me, they are like people who have
|
58
|
+
decided to learn 5% of their field in order to get a few things done, have some fun,
|
59
|
+
and make a living.
|
60
|
+
|
61
|
+
<p>
|
62
|
+
These people use tools to create little applications for everyday use. But remember:
|
63
|
+
The tools themselves are also software. But they are a level of software far beyond
|
64
|
+
anything these people could dream of creating. They use languages, editors,
|
65
|
+
compilers, and operating systems; but they don't have the first clue about how to
|
66
|
+
create any of these things or even how they really work.
|
67
|
+
|
68
|
+
<p>
|
69
|
+
In 20 years, some race car driver is going to hold a kid in his lap, and the kid is
|
70
|
+
going to say, "Well, I can drive a car, too. Everybody can drive a car. You just
|
71
|
+
push the green button and say, 'Take me to Wal-Mart.'" And I kind of feel like that
|
72
|
+
race car driver sometimes.
|
73
|
+
|
74
|
+
<p>
|
75
|
+
Bringing it back to computers... My friend had a 7-year-old who used a fancy tool
|
76
|
+
that he learned by himself, and he created a game for the iPhone. Sure, it was a
|
77
|
+
simple game. But he did something by himself that a PhD could barely have done
|
78
|
+
30 years ago (and not on a handheld device).
|
79
|
+
|
80
|
+
<p>
|
81
|
+
To some extent, my complaints are valid. And to some extent, it's just me being
|
82
|
+
an old-timer and a curmudgeon.
|
83
|
+
|
84
|
+
<p>
|
85
|
+
Sometimes I interact with certain people and their complaints and questions show
|
86
|
+
where they have reached the boundaries of their knowledge. And sometimes it's
|
87
|
+
shocking to me. I think: You should have learned that in your first computer science
|
88
|
+
class in your first semester. And then I remember: This person never had a real
|
89
|
+
computer science class at all.
|
90
|
+
|
91
|
+
<p>
|
92
|
+
Of course, generations before me look at me the same way. In the 1940s, you
|
93
|
+
pretty much had to have a degree in electrical engineering in order to see or touch
|
94
|
+
a computer. In the 70s and early 80s, you just had to be a science or engineering
|
95
|
+
major. In the 90s, you just had to have a credit card (or have parents with a credit
|
96
|
+
card).
|
97
|
+
|
98
|
+
<p>
|
99
|
+
I'm very lost with hardware, by the way. I live on the keyboard. Every time I ever
|
100
|
+
opened up a computer to try to change something, I screwed up two other things.
|
101
|
+
I'm strictly a software guy. I've known people who made fun of me for that, and
|
102
|
+
even older people who laughed a little at me because I didn't know how to use a
|
103
|
+
soldering iron.
|
104
|
+
|
105
|
+
<p>
|
106
|
+
It all depends really on what a person really wants to do. If you want to make
|
107
|
+
online stores and shopping carts and web forms and pretty pictures and social media
|
108
|
+
apps, then you don't need a degree in computer science anymore. Not even an
|
109
|
+
associate's degree.
|
110
|
+
|
111
|
+
<p>
|
112
|
+
If you want to make really interesting exciting things that have never existed before,
|
113
|
+
if you want to make a tiny little difference in the industry and change the world just a
|
114
|
+
little bit, then you do need that degree. If you want to make the tools and libraries
|
115
|
+
that the lower-level people use, you do need that degree.
|
116
|
+
|
117
|
+
<p>
|
118
|
+
Or look at it this way: If you want to build doghouses, just pick up some skills with
|
119
|
+
hammer and nails, and then go for it. If you want to be an architect who designs and
|
120
|
+
builds skyscrapers, then go get a degree in architecture first. But please (speaking
|
121
|
+
again as a curmudgeon), don't learn to build doghouses and call yourself an architect.
|
122
|
+
|
123
|
+
<p>
|
124
|
+
I hope this silly rant is helpful in some way. :)
|
125
|
+
|
126
|
+
<p>
|
127
|
+
Ask me any more detailed questions if you want to.
|
128
|
+
|
129
|
+
<p>
|
130
|
+
Cheers,
|
131
|
+
|
132
|
+
<p>
|
133
|
+
Hal
|
134
|
+
|
135
|
+
<p>
|
136
|
+
</div>
|
137
|
+
</article>
|
138
|
+
</body>
|
139
|
+
</html>
|
@@ -0,0 +1,104 @@
|
|
1
|
+
.h1 Computer science as a lost art
|
2
|
+
|
3
|
+
.set post.num = 0011
|
4
|
+
.set post.slug = computer-science-as-a-lost-art
|
5
|
+
.set post.date = 2015-09-17
|
6
|
+
.set post.title = Computer science as a lost art
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
An old friend of mine asked me this in email last night...
|
13
|
+
|
14
|
+
Thanks for taking the time here. My younger son is interested in pursuing a career in computer science. He's a freshman at Kennesaw State right now, but he really struggles with the idea of taking two years of classes that he has very little interest in. There are three schools in Atlanta with 8- to 16-week full-day immersive courses that focus solely on technology: The Iron Yard, Digital Crafts, and General Assembly. In the world of computer science, what is the opinion is of programs like this? Is a 4-year degree viewed as more valuable?
|
15
|
+
|
16
|
+
This morning, this was my off-the-cuff answer:
|
17
|
+
|
18
|
+
Well, here is my opinion... I'm speaking as someone with two degrees and
|
19
|
+
therefore six years in comp sci, as well as 30 years' experience. In other words,
|
20
|
+
I'm old-fashioned, a freaking dinosaur. :)
|
21
|
+
|
22
|
+
There is a whole generation of computer people who are very different from the
|
23
|
+
previous generation. CS used to be (and really still is) a very deep and demanding
|
24
|
+
field.
|
25
|
+
|
26
|
+
But two or three things have happened. First of all, computers are pretty much
|
27
|
+
universal now. Do you know anyone under 80 who doesn't have one? Second, the
|
28
|
+
World Wide Web (born in 1989 as a "face" on the more bare-bones Internet)
|
29
|
+
started being invaded by the general public in 1995 or so. As usage became more
|
30
|
+
common, it became more important to everyday life. And third, the tools we use
|
31
|
+
to create applications have gotten a bit more sophisticated. It's easier to use these
|
32
|
+
tools, just as it's easier to drive a car now than it was in 1905.
|
33
|
+
|
34
|
+
What all this means is that there are more kinds of "computer person" than there
|
35
|
+
ever were before. There are many thousands of "programmers" who never took
|
36
|
+
a programming course. This is both good and bad.
|
37
|
+
|
38
|
+
It means that a person can get the little things done while knowing very little. But it
|
39
|
+
also means that this person probably will never learn enough to get the big things done.
|
40
|
+
|
41
|
+
To be honest, I get secretly frustrated with the lower-level people who now exist
|
42
|
+
in giant hordes. (I rarely tell anyone that.) To me, they are like people who have
|
43
|
+
decided to learn 5% of their field in order to get a few things done, have some fun,
|
44
|
+
and make a living.
|
45
|
+
|
46
|
+
These people use tools to create little applications for everyday use. But remember:
|
47
|
+
The tools themselves are also software. But they are a level of software far beyond
|
48
|
+
anything these people could dream of creating. They use languages, editors,
|
49
|
+
compilers, and operating systems; but they don't have the first clue about how to
|
50
|
+
create any of these things or even how they really work.
|
51
|
+
|
52
|
+
In 20 years, some race car driver is going to hold a kid in his lap, and the kid is
|
53
|
+
going to say, "Well, I can drive a car, too. Everybody can drive a car. You just
|
54
|
+
push the green button and say, 'Take me to Wal-Mart.'" And I kind of feel like that
|
55
|
+
race car driver sometimes.
|
56
|
+
|
57
|
+
Bringing it back to computers... My friend had a 7-year-old who used a fancy tool
|
58
|
+
that he learned by himself, and he created a game for the iPhone. Sure, it was a
|
59
|
+
simple game. But he did something by himself that a PhD could barely have done
|
60
|
+
30 years ago (and not on a handheld device).
|
61
|
+
|
62
|
+
To some extent, my complaints are valid. And to some extent, it's just me being
|
63
|
+
an old-timer and a curmudgeon.
|
64
|
+
|
65
|
+
Sometimes I interact with certain people and their complaints and questions show
|
66
|
+
where they have reached the boundaries of their knowledge. And sometimes it's
|
67
|
+
shocking to me. I think: You should have learned that in your first computer science
|
68
|
+
class in your first semester. And then I remember: This person never had a real
|
69
|
+
computer science class at all.
|
70
|
+
|
71
|
+
Of course, generations before me look at me the same way. In the 1940s, you
|
72
|
+
pretty much had to have a degree in electrical engineering in order to see or touch
|
73
|
+
a computer. In the 70s and early 80s, you just had to be a science or engineering
|
74
|
+
major. In the 90s, you just had to have a credit card (or have parents with a credit
|
75
|
+
card).
|
76
|
+
|
77
|
+
I'm very lost with hardware, by the way. I live on the keyboard. Every time I ever
|
78
|
+
opened up a computer to try to change something, I screwed up two other things.
|
79
|
+
I'm strictly a software guy. I've known people who made fun of me for that, and
|
80
|
+
even older people who laughed a little at me because I didn't know how to use a
|
81
|
+
soldering iron.
|
82
|
+
|
83
|
+
It all depends really on what a person really wants to do. If you want to make
|
84
|
+
online stores and shopping carts and web forms and pretty pictures and social media
|
85
|
+
apps, then you don't need a degree in computer science anymore. Not even an
|
86
|
+
associate's degree.
|
87
|
+
|
88
|
+
If you want to make really interesting exciting things that have never existed before,
|
89
|
+
if you want to make a tiny little difference in the industry and change the world just a
|
90
|
+
little bit, then you do need that degree. If you want to make the tools and libraries
|
91
|
+
that the lower-level people use, you do need that degree.
|
92
|
+
|
93
|
+
Or look at it this way: If you want to build doghouses, just pick up some skills with
|
94
|
+
hammer and nails, and then go for it. If you want to be an architect who designs and
|
95
|
+
builds skyscrapers, then go get a degree in architecture first. But please (speaking
|
96
|
+
again as a curmudgeon), don't learn to build doghouses and call yourself an architect.
|
97
|
+
|
98
|
+
I hope this silly rant is helpful in some way. :)
|
99
|
+
|
100
|
+
Ask me any more detailed questions if you want to.
|
101
|
+
|
102
|
+
Cheers,
|
103
|
+
|
104
|
+
Hal
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Ruby Day in Turin, Italy</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Ruby Day in Turin, Italy">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-11-10">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Ruby Day in Turin, Italy</h1>
|
16
|
+
<time datetime="2015-11-10">November 10, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
I'm honored to be speaking on Friday at Ruby Day in Turin, Italy.
|
22
|
+
See http://rubyday.it for the schedule.
|
23
|
+
I love my career, and I love traveling. It's nice when I get to
|
24
|
+
combine them. This is one of those times.
|
25
|
+
|
26
|
+
<p>
|
27
|
+
I'll be presenting a talk entitled "Elixir for the Rubyist" (the
|
28
|
+
same as the title of the book I'm working on).
|
29
|
+
|
30
|
+
<p>
|
31
|
+
If you're a Periscope user, be aware that I might try to stream
|
32
|
+
some of this event (as well as some of my travels around the city).
|
33
|
+
|
34
|
+
<p>
|
35
|
+
I'll also try to post a link to my slides later (and a video if
|
36
|
+
they happen to make one).
|
37
|
+
|
38
|
+
<p>
|
39
|
+
</div>
|
40
|
+
</article>
|
41
|
+
</body>
|
42
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.h1 Ruby Day in Turin, Italy
|
2
|
+
|
3
|
+
.set post.num = 0012
|
4
|
+
.set post.slug = ruby-day-in-turin-italy
|
5
|
+
.set post.date = 2015-11-10
|
6
|
+
.set post.title = Ruby Day in Turin, Italy
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
I'm honored to be speaking on Friday at Ruby Day in Turin, Italy.
|
13
|
+
See http://rubyday.it for the schedule.
|
14
|
+
I love my career, and I love traveling. It's nice when I get to
|
15
|
+
combine them. This is one of those times.
|
16
|
+
|
17
|
+
I'll be presenting a talk entitled "Elixir for the Rubyist" (the
|
18
|
+
same as the title of the book I'm working on).
|
19
|
+
|
20
|
+
If you're a Periscope user, be aware that I might try to stream
|
21
|
+
some of this event (as well as some of my travels around the city).
|
22
|
+
|
23
|
+
I'll also try to post a link to my slides later (and a video if
|
24
|
+
they happen to make one).
|