scriptorium 0.0.3 → 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/README.lt3 +324 -0
- data/README.md +3155 -1
- data/assets/.DS_Store +0 -0
- data/assets/README.md +44 -0
- data/assets/icons/social/reddit.png +0 -0
- data/assets/icons/social/x-logo.png +0 -0
- data/assets/icons/ui/.DS_Store +0 -0
- data/assets/icons/ui/back.png +0 -0
- data/assets/icons/ui/copy.png +0 -0
- data/assets/icons/ui/down.png +0 -0
- data/assets/icons/ui/end.png +0 -0
- data/assets/icons/ui/exit.png +0 -0
- data/assets/icons/ui/foo +10 -0
- data/assets/icons/ui/home.png +0 -0
- data/assets/icons/ui/left.png +0 -0
- data/assets/icons/ui/next.png +0 -0
- data/assets/icons/ui/right.png +0 -0
- data/assets/icons/ui/start.png +0 -0
- data/assets/icons/ui/up.png +0 -0
- data/assets/imagenotfound.jpg +0 -0
- data/assets/samples/placeholder.svg +9 -0
- data/assets/themes/standard/favicon.svg +6 -0
- data/bin/sblog +84 -5
- data/bin/scriptorium +1 -0
- data/doc/README.txt +6 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
- data/doc/anti-amnesia/20250807-213025.md +116 -0
- 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/banner_svg_config.md +114 -0
- data/doc/contrib.lt3 +8 -0
- data/doc/dependencies.md +281 -0
- data/doc/hacker.lt3 +5 -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/myuserdoc/userdoc-toc.txt +88 -0
- 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_credentials_template.json +8 -0
- data/doc/reddit_integration.md +207 -0
- data/doc/user.lt3 +35 -0
- data/doc/user_guide_section_1.md +137 -0
- data/doc/user_guide_section_10.md +515 -0
- data/doc/user_guide_section_11.md +708 -0
- data/doc/user_guide_section_2.md +233 -0
- data/doc/user_guide_section_3.md +5 -0
- data/doc/user_guide_section_4.md +221 -0
- data/doc/user_guide_section_5.md +243 -0
- data/doc/user_guide_section_6.md +147 -0
- data/doc/user_guide_section_7.md +311 -0
- data/doc/user_guide_section_8.md +224 -0
- data/doc/user_guide_section_9.md +375 -0
- data/lib/rouge/lexers/livetext.rb +74 -0
- data/lib/scriptorium/api.rb +2373 -0
- data/lib/scriptorium/banner_svg.rb +729 -0
- data/lib/scriptorium/contract.rb +34 -0
- data/lib/scriptorium/exceptions.rb +201 -1
- data/lib/scriptorium/helpers.rb +675 -0
- data/lib/scriptorium/post.rb +259 -0
- data/lib/scriptorium/reddit.rb +83 -0
- data/lib/scriptorium/repo.rb +938 -0
- data/lib/scriptorium/standard_files.rb +149 -0
- data/lib/scriptorium/support/bootstrap/css.txt +5 -0
- data/lib/scriptorium/support/bootstrap/js.txt +4 -0
- 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.txt +10 -0
- data/lib/scriptorium/support/config/reddit_template.txt +17 -0
- data/lib/scriptorium/support/config/social.txt +8 -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/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
- data/lib/scriptorium/support/templates/layout.txt +5 -0
- data/lib/scriptorium/support/templates/post.lt3 +104 -0
- data/lib/scriptorium/support/theme/footer.lt3 +2 -0
- data/lib/scriptorium/support/theme/header.lt3 +4 -0
- data/lib/scriptorium/support/theme/left.lt3 +3 -0
- data/lib/scriptorium/support/theme/main.lt3 +5 -0
- data/lib/scriptorium/support/theme/right.lt3 +3 -0
- data/lib/scriptorium/theme.rb +192 -0
- data/lib/scriptorium/version.rb +1 -1
- data/lib/scriptorium/view.rb +1021 -0
- data/lib/scriptorium/widgets/featured_posts.rb +149 -0
- data/lib/scriptorium/widgets/links.rb +112 -0
- data/lib/scriptorium/widgets/pages.rb +133 -0
- data/lib/scriptorium/widgets/widget.rb +133 -0
- data/lib/scriptorium.rb +38 -34
- data/lib/skeleton.rb +10 -1
- data/scriptorium.gemspec +17 -5
- data/test/README.md +69 -0
- data/test/WEB_INTEGRATION_README.md +196 -0
- data/test/all +83 -0
- data/test/api_demo.rb +99 -0
- data/test/assets/imagenotfound.jpg +0 -0
- data/test/assets/images/.DS_Store +0 -0
- data/test/assets/images/README.md +27 -0
- data/test/assets/images/odd_aspect.png +0 -0
- data/test/assets/images/perfect.png +0 -0
- data/test/assets/images/small.png +0 -0
- data/test/assets/images/tall.png +0 -0
- data/test/assets/images/very_tall.png +0 -0
- data/test/assets/images/very_wide.png +0 -0
- data/test/assets/images/wide.png +0 -0
- data/test/assets/testbanner.jpg +0 -0
- data/test/banner_svg/simple_helpers.rb +13 -0
- data/test/banner_svg/unit.rb +1000 -0
- data/test/config/deployment.txt +5 -0
- data/test/ed_test.rb +204 -0
- data/test/integration/cursor_banner_combinations.rb +193 -0
- data/test/integration/cursor_banner_features.rb +374 -0
- data/test/integration/integration_test.rb +326 -0
- data/test/integration/preview_flow_test.rb +94 -0
- data/test/livetext_plugin_test.rb +500 -0
- data/test/manual/asset_mgmt.rb +67 -0
- data/test/manual/banner-tests/index.html +45 -0
- data/test/manual/banner-tests/svg.txt +3 -0
- data/test/manual/banner-tests/test01.html +122 -0
- data/test/manual/banner-tests/test02.html +122 -0
- data/test/manual/banner-tests/test03.html +122 -0
- data/test/manual/banner-tests/test04.html +129 -0
- data/test/manual/banner-tests/test05.html +129 -0
- data/test/manual/banner-tests/test06.html +129 -0
- data/test/manual/banner-tests/test07.html +129 -0
- data/test/manual/banner-tests/test08.html +123 -0
- data/test/manual/banner-tests/test09.html +123 -0
- data/test/manual/banner-tests/test10.html +123 -0
- data/test/manual/banner-tests/test11.html +123 -0
- data/test/manual/banner-tests/test12.html +123 -0
- data/test/manual/banner-tests/test13.html +123 -0
- data/test/manual/banner-tests/test14.html +123 -0
- data/test/manual/banner-tests/test15.html +122 -0
- data/test/manual/banner-tests/test16.html +122 -0
- data/test/manual/banner-tests/test17.html +122 -0
- data/test/manual/banner-tests/test18.html +132 -0
- data/test/manual/banner-tests/test19.html +132 -0
- data/test/manual/banner-tests/test20.html +132 -0
- data/test/manual/banner-tests/test21.html +132 -0
- data/test/manual/banner-tests/test22.html +132 -0
- data/test/manual/banner-tests/test23.html +132 -0
- data/test/manual/banner-tests/test24.html +132 -0
- data/test/manual/banner-tests/test25.html +131 -0
- data/test/manual/banner_environment.rb +205 -0
- data/test/manual/codemirror_demo.html +773 -0
- data/test/manual/create_posts_for_web.rb +114 -0
- data/test/manual/environment.rb +67 -0
- data/test/manual/make_banner.rb +153 -0
- data/test/manual/preview_manual_test.rb +129 -0
- data/test/manual/sample_banner_config.txt +12 -0
- data/test/manual/test_advanced_widgets.rb +73 -0
- data/test/manual/test_banner_combinations.rb +120 -0
- data/test/manual/test_banner_features.rb +306 -0
- data/test/manual/test_banner_integration.rb +115 -0
- data/test/manual/test_banner_radial.rb +87 -0
- data/test/manual/test_basic_posts.rb +47 -0
- data/test/manual/test_layout_widgets.rb +40 -0
- data/test/manual/test_pagination.rb +24 -0
- data/test/manual/test_random_posts.rb +38 -0
- data/test/manual/test_syntax_highlighting.rb +167 -0
- data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
- data/test/rubytext/rubytext_demo_test.rb +42 -0
- data/test/rubytext/rubytext_testing_guide.md +277 -0
- data/test/run_automated_tests.rb +45 -0
- data/test/staging/.DS_Store +0 -0
- data/test/support/preview_utils.rb +88 -0
- data/test/syntax_highlighting_test.lt3 +124 -0
- data/test/test_gem_assets.rb +48 -0
- data/test/test_helpers.rb +240 -0
- data/test/tui_editor_integration_test.rb +296 -0
- data/test/tui_integration_test.rb +883 -0
- data/test/unit/api.rb +1776 -0
- data/test/unit/asset_management.rb +219 -0
- data/test/unit/backup_test.rb +451 -0
- data/test/unit/clipboard_test.rb +60 -0
- data/test/unit/contract_test.rb +69 -0
- data/test/unit/core.rb +1211 -0
- data/test/unit/deploy_config_test.rb +248 -0
- data/test/unit/deploy_test.rb +478 -0
- data/test/unit/edit_post_test.rb +168 -0
- data/test/unit/gem_asset_management.rb +183 -0
- data/test/unit/livetext_basic.rb +57 -0
- data/test/unit/livetext_compatibility.rb +82 -0
- data/test/unit/parse_cmd_test.rb +260 -0
- data/test/unit/permalink_copy_test.rb +211 -0
- data/test/unit/post.rb +309 -0
- 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 +278 -0
- data/test/unit/reddit_test.rb +235 -0
- data/test/unit/repo.rb +569 -0
- data/test/unit/social_test.rb +366 -0
- data/test/unit/syntax_highlighting.rb +70 -0
- data/test/unit/theme_management_test.rb +91 -0
- data/test/unit/view.rb +498 -0
- data/test/unit/widgets.rb +669 -0
- 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/test/wizard_test.rb +123 -0
- data/ui/README.md +67 -0
- data/ui/common/lib/ui_common.rb +8 -0
- data/ui/rubytext/README.md +191 -0
- data/ui/rubytext/bin/scriptorium-rubytext +402 -0
- data/ui/rubytext/lib/rubytext_ui.rb +300 -0
- data/ui/tui/bin/scriptorium +1890 -0
- data/ui/tui/test/tui_test.rb +23 -0
- data/ui/web/app/app.rb +2600 -0
- data/ui/web/app/assets/livetext_mode.js +244 -0
- data/ui/web/app/error_helpers.rb +150 -0
- data/ui/web/app/views/advanced_config.erb +196 -0
- data/ui/web/app/views/asset_management.erb +645 -0
- data/ui/web/app/views/backup_management.erb +238 -0
- data/ui/web/app/views/banner_config.erb +200 -0
- data/ui/web/app/views/config_widget.erb +232 -0
- data/ui/web/app/views/configure_view.erb +401 -0
- data/ui/web/app/views/dashboard.erb +154 -0
- data/ui/web/app/views/deploy_config.erb +149 -0
- data/ui/web/app/views/edit_pages.erb +363 -0
- data/ui/web/app/views/edit_post.erb +175 -0
- 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/error_page.erb +29 -0
- data/ui/web/app/views/header_config.erb +155 -0
- data/ui/web/app/views/layout_config.erb +147 -0
- data/ui/web/app/views/navbar_config.erb +411 -0
- data/ui/web/app/views/theme_management.erb +130 -0
- data/ui/web/app/views/view_dashboard.erb +779 -0
- data/ui/web/app/views/widgets.erb +249 -0
- data/ui/web/bin/scriptorium-web +164 -0
- data/ui/web/test/web_basic_test.rb +38 -0
- data/ui/web/test_navbar.txt +7 -0
- data/ui/web/tmp/timing.log +17 -0
- data/ui/web/tmp/web_server.log +0 -0
- metadata +434 -8
- data/lib/scriptorium/engine.rb +0 -22
- data/test/engine/unit.rb +0 -44
@@ -0,0 +1,146 @@
|
|
1
|
+
.h1 Programmers and word processing
|
2
|
+
|
3
|
+
.set post.num = 0002
|
4
|
+
.set post.slug = programmers-and-word-processing
|
5
|
+
.set post.date = 2014-09-17
|
6
|
+
.set post.title = Programmers and word processing
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing writing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
The other day, I was thinking about the mechanics of writing. Not grammar, spelling, and punctuation,
|
13
|
+
but the actual work flow involved.
|
14
|
+
Specifically, I was trying to gather my thoughts on why writing a software book using Microsoft Word
|
15
|
+
is so incredibly painful. (Granted, I have used Word or similar tools to write fiction and shorter pieces.)
|
16
|
+
|
17
|
+
It wouldn't seem so at first, would it? Isn't word processing software the savior of the writer? Wouldn't
|
18
|
+
we be using typewriters without it?
|
19
|
+
|
20
|
+
Well, yes and no. Several facts have to be considered here: 1. I'm a programmer (and a somewhat old-fashioned
|
21
|
+
one, who almost always goes straight to the command line). 2. When you write a programming book, there is
|
22
|
+
often a need to manipulate the text in various ways you otherwise wouldn't. This is even more true for a
|
23
|
+
"larger" document like a book of a few hundred pages. 3. Programmers by nature want the computer to do things
|
24
|
+
for them. It's natural to want to write code to manipulate your text.
|
25
|
+
|
26
|
+
the typewriter and the modern word processing suites. It's a forgotten generation of software -- forgotten
|
27
|
+
partly because computer guys were mostly the only ones who ever used it, and today even the younger software
|
28
|
+
professionals don't remember it.
|
29
|
+
|
30
|
+
I'm talking, of course, about what we commonly call a text formatter_. Many of you who read this will have
|
31
|
+
much more experience here than I do, but I'll share from my own limited knowledge and experience.
|
32
|
+
|
33
|
+
I'll assume some of my readers have no idea what I'm talking about. A text formatter is just a piece of software
|
34
|
+
that takes plain text (mixed with some metadata relating to formatting) and produces a formatted document. Think
|
35
|
+
of it as a little like HTML, but usually without nesting. Typically if a line of text started with a dot, it
|
36
|
+
would be interpreted as a formatting instruction rather than as raw text.
|
37
|
+
|
38
|
+
This was before there were laser printers (or at least I had never heard of them). Although I don't go back to
|
39
|
+
the early days of Unix utilities like troff and nroff, I did know about them and have touched them (in the early
|
40
|
+
to mid-1980s). I've even used a similar tool on an IBM mainframe (called Scripsit, as I recall). I'm certain
|
41
|
+
there were similar things on the DEC-10 and many other forgotten platforms. Even in the late 80s, when word
|
42
|
+
processing was coming into its own, many of the tools still were not fully "WYSIWYG."
|
43
|
+
|
44
|
+
Remember that term? "What You See Is What You Get"? It was coined because this was rather a new concept. With
|
45
|
+
text formatters, what you saw was not what you got.
|
46
|
+
|
47
|
+
Even back then, there were more sophisticated tools. TeX was around, though I didn't know it and never really
|
48
|
+
saw it. LaTeX I suppose came later. At that time, dot matrix printers were not uncommon -- and on the mainframes,
|
49
|
+
even line printers were still common (typically without even lowercase letters).
|
50
|
+
|
51
|
+
As for "really fancy" output such as TeX could produce, I don't know that our comp sci department or our
|
52
|
+
computer center could really print such material. If I used a printer that could print italics and boldface text,
|
53
|
+
I was ecstatic.
|
54
|
+
|
55
|
+
This is starting to sound like the stories about walking to school in the snow, right? And it was uphill both
|
56
|
+
ways? That's not my point. The hardware was primitive, yes, and the software was primitive, too.
|
57
|
+
|
58
|
+
When WYSIWYG came along, suddenly armies of "ordinary people" escaped their typewriters and learned the joys of
|
59
|
+
backspace and delete. Programmers benefited, too. And yet...
|
60
|
+
|
61
|
+
I won't even go into the disadvantages of the GUI in general. That could be a controversy in itself. Suffice to
|
62
|
+
say that I earned two degrees in computer science and hardly even touched a mouse. In fact, I don't think I
|
63
|
+
actually owned a mouse until four or five years later. I remember with fondness the online signature of one
|
64
|
+
Arno Schaefer: (How do I type) ("for i in *.dvi do xdvi i done") (in a GUI?) But that is a little outside our
|
65
|
+
discussion here.
|
66
|
+
|
67
|
+
From a programmer's perspective, a primary failing of the word processor in general is that it stores documents
|
68
|
+
in a binary format rather than text. It is difficult or impossible to peer into those files from the outside.
|
69
|
+
|
70
|
+
That means that all of the traditional Unix utilities, so useful for text files, are useless for Word documents
|
71
|
+
and similar file types. Which utilities? That depends on how well you know Unix and how much time you have
|
72
|
+
spent at the command line.
|
73
|
+
|
74
|
+
The first utility, of course, is the text editor itself. If you want fancy formatting and WYSIWYG, the traditional
|
75
|
+
editors like vim and emacs won't seem that great to you. But if you want something "lean, mean, and easy" --
|
76
|
+
maybe these are pretty great after all. (Granted, nothing ever seems "cool" until you learn to use it effectively.)
|
77
|
+
|
78
|
+
Personally I use vim (although I freely admit that emacs is more powerful, just as I admit LISP is more powerful
|
79
|
+
than any of my favorite languages). It loads into memory very quickly, it loads files quickly, it saves them
|
80
|
+
quickly, and it never crashes. Navigation is fast and simple (again, if you know what you're doing). I've never
|
81
|
+
done real scripting in vim, but I have sometimes used macros and such.
|
82
|
+
|
83
|
+
But the editor is only the beginning. Some of the utilities I have used are: grep, wc, fold, cut, colrm,
|
84
|
+
diff, sdiff, csplit, expand, head, tail, less, more, cut, sort, split, strings, tee, tr, and uniq. Sometimes I have
|
85
|
+
even used awk, sed, and m4. I can combine files, split them, search them, and manipulate their contents at will.
|
86
|
+
|
87
|
+
I can redirect standard input, standard output, and standard error for these utilities. I can use pipes with them.
|
88
|
+
Many of these tools understand regular expressions. I can build scripts that perform multiple commands, even with
|
89
|
+
some simple branching and looping logic involved.
|
90
|
+
|
91
|
+
None of these things are possible in general with Word documents. None of these tools or techniques will work well
|
92
|
+
with such a file format.
|
93
|
+
|
94
|
+
But let's go a step farther... I'm a programmer, after all. I principally work in Ruby, which is good for text
|
95
|
+
processing (far more powerful and friendly than bash or awk, for instance).
|
96
|
+
|
97
|
+
I have written programs that could search and/or replace only in the body of the text, only in the source code,
|
98
|
+
or in both. I have written programs to extract code fragments from the text, to insert them, to syntax-check them,
|
99
|
+
and to format them. I've written programs to create test cases, to syntax-check code, and to reorder (and renumber)
|
100
|
+
sections and other items. I've written code that will honor the file format (and code fragments) and spell-check
|
101
|
+
the document, naturally honoring all the technical terms and abbreviations unique to my topic. I've written code
|
102
|
+
to extract a table of contents, lists of figures, and lists of code listings. I've written code to compare the
|
103
|
+
sizes of different sections, code to check cross-references, and code to suggest keywords for the index.
|
104
|
+
|
105
|
+
Is all this overkill? You could argue that. Some of these things are doable in MS Word, after all. But you have to
|
106
|
+
do everything their_ way; you can't tweak or customize the functions; and you can't turn off all the features you
|
107
|
+
don't need or want. Furthermore, you can't automate it, you have to use the mouse, and sometimes it just crashes or
|
108
|
+
malfunctions for a reason you may or may not figure out.
|
109
|
+
|
110
|
+
There are many solutions, of course. If you know TeX, that is probably the ultimate tool; and there are add-ons
|
111
|
+
such as LaTeX and Lyx to make it easier. I've never learned any of this; for most of my purposes, it would be a
|
112
|
+
case of killing a mosquito with a hand grenade. On the other hand... if I were writing a calculus textbook, as I
|
113
|
+
never will, I would want something like that to handle all the mathematical notation.
|
114
|
+
|
115
|
+
As a side note, I've never used Lyx. But I've heard it is a nice compromise between the two paradigms -- a WYSIWYG
|
116
|
+
editor that also offers low-level access to the raw markup.
|
117
|
+
|
118
|
+
What's interesting is that people often "roll their own" solutions. I have done it myself (although I principally
|
119
|
+
worked with plain HTML), and I have seen it done by others more than once. It's natural, as programmers are always
|
120
|
+
looking for an easier or better way to do things.
|
121
|
+
|
122
|
+
Once in a while, a programmer will build a solution that is also intended to benefit others who think the same way.
|
123
|
+
An excellent example is the relatively new Softcover_, created by Michael Hartl (https://www.softcover.io/).
|
124
|
+
I've only begun to learn it myself, but my initial impression is that what troff was in the 70s, softcover will be
|
125
|
+
in only a year or two. It looks to me like a powerful text formatter for the 21st century -- a tool that will let
|
126
|
+
the author/programmer do what he wants without getting too much in the way.
|
127
|
+
|
128
|
+
Softcover was designed (in my opinion) the "right way" -- that is, it was first built for a specific purpose, and
|
129
|
+
during that process, ideas were generated, and lessons were learned. This enables the developer to avoid false moves,
|
130
|
+
design flaws, and "dead ends." Remember that, in the same way, Ruby on Rails was first an application (Basecamp, as
|
131
|
+
I recall) before it was abstracted and generalized into a framework.
|
132
|
+
|
133
|
+
Softcover does other things right as well. It isn't just a tool or framework, but also a publishing platform for
|
134
|
+
ebooks. There is at least one print book published this way as well, and I expect more.
|
135
|
+
|
136
|
+
When programmers write, the readers are often programmers as well. And we are certainly (on the whole) heavy
|
137
|
+
consumers of electronic reading material. Only one American in four uses any kind of ebook reader; but do you know
|
138
|
+
of even a single software person who doesn't use one?
|
139
|
+
|
140
|
+
So it's a tool, and it's a publishing platform. The business model permits the author to keep a high percentage of
|
141
|
+
the sale price of the book. All this assumes, of course, that the author is actually capable of producing quality
|
142
|
+
material without the help of the host of individuals at a traditional publishing house. But I've noticed that this
|
143
|
+
often can be done, especially if the author seeks a little outside help now and then.
|
144
|
+
|
145
|
+
So I see Softcover as a tool, a platform, and community that connects writers to readers (and to each other). You
|
146
|
+
might consider checking it out.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>How to turn your brain sideways</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="How to turn your brain sideways">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-07-17">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>How to turn your brain sideways</h1>
|
16
|
+
<time datetime="2015-07-17">July 17, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
If you think in OOP, as I do, then functional programming is a great way to
|
22
|
+
shake your neurons out of their complacency.
|
23
|
+
If you already know FP, you may be smiling a little. Maybe you learned it a
|
24
|
+
long time ago. Maybe it's natural to you. To me, it isn't.
|
25
|
+
|
26
|
+
<p>
|
27
|
+
The three basic stumbling blocks for me are:
|
28
|
+
|
29
|
+
<p>
|
30
|
+
<ul>
|
31
|
+
<li>The concept that all data are immutable</li>
|
32
|
+
<li>The concept of tail recursion as opposed to looping</li>
|
33
|
+
<li>The concept of pattern matching as opposed to traditional assignment</li>
|
34
|
+
</ul>
|
35
|
+
Yet, of course, those are perhaps the very foundations of functional programming.
|
36
|
+
In theory, it all makes sense to me; but it doesn't yet stick to my brain.
|
37
|
+
|
38
|
+
<p>
|
39
|
+
In many ways, it is literally like learning a foreign language. Not just varying
|
40
|
+
syntax and slightly different semantics. If you know C++, Java, Object Pascal, or
|
41
|
+
any host of other languages, then you know that these feel "similar" in some ways.
|
42
|
+
|
43
|
+
<p>
|
44
|
+
Here's an analogy for you. If you have studied French, Spanish, and Italian, you
|
45
|
+
have noticed they are of the same "family." They're not identical by any means,
|
46
|
+
but you can often transfer knowledge from one area to another. That's how OOP
|
47
|
+
languages feel to me.
|
48
|
+
|
49
|
+
<p>
|
50
|
+
On the other hand, functional languages feel to me as if I were trying to learn
|
51
|
+
an Asian tongue like Japanese or Korean. The differences are not just fairly minor
|
52
|
+
differences in syntax and semantics, but a difference in paradigm.
|
53
|
+
|
54
|
+
<p>
|
55
|
+
Learning Elixir is making me feel young and incompetent again. This is a nice break
|
56
|
+
from feeling old and incompetent.
|
57
|
+
</div>
|
58
|
+
</article>
|
59
|
+
</body>
|
60
|
+
</html>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
.h1 How to turn your brain sideways
|
2
|
+
|
3
|
+
.set post.num = 0003
|
4
|
+
.set post.slug = how-to-turn-your-brain-sideways
|
5
|
+
.set post.date = 2015-07-17
|
6
|
+
.set post.title = How to turn your brain sideways
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
If you think in OOP, as I do, then functional programming is a great way to
|
13
|
+
shake your neurons out of their complacency.
|
14
|
+
If you already know FP, you may be smiling a little. Maybe you learned it a
|
15
|
+
long time ago. Maybe it's natural to you. To me, it isn't.
|
16
|
+
|
17
|
+
The three basic stumbling blocks for me are:
|
18
|
+
|
19
|
+
The concept that all data are immutable
|
20
|
+
The concept of tail recursion as opposed to looping
|
21
|
+
The concept of pattern matching as opposed to traditional assignment
|
22
|
+
|
23
|
+
Yet, of course, those are perhaps the very foundations of functional programming.
|
24
|
+
In theory, it all makes sense to me; but it doesn't yet stick to my brain.
|
25
|
+
|
26
|
+
In many ways, it is literally like learning a foreign language. Not just varying
|
27
|
+
syntax and slightly different semantics. If you know C++, Java, Object Pascal, or
|
28
|
+
any host of other languages, then you know that these feel "similar" in some ways.
|
29
|
+
|
30
|
+
Here's an analogy for you. If you have studied French, Spanish, and Italian, you
|
31
|
+
have noticed they are of the same "family." They're not identical by any means,
|
32
|
+
but you can often transfer knowledge from one area to another. That's how OOP
|
33
|
+
languages feel to me.
|
34
|
+
|
35
|
+
On the other hand, functional languages feel to me as if I were trying to learn
|
36
|
+
an Asian tongue like Japanese or Korean. The differences are not just fairly minor
|
37
|
+
differences in syntax and semantics, but a difference in paradigm.
|
38
|
+
|
39
|
+
Learning Elixir is making me feel young and incompetent again. This is a nice break
|
40
|
+
from feeling old and incompetent.
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Upcoming Lone Star Ruby Conference...</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Upcoming Lone Star Ruby Conference...">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-07-20">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Upcoming Lone Star Ruby Conference...</h1>
|
16
|
+
<time datetime="2015-07-20">July 20, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
After a short hiatus, LSRC is back! Join us in Austin next month. Speakers have
|
22
|
+
just been announced.
|
23
|
+
I submitted a proposal, but it wasn't accepted this time. But many other fine people
|
24
|
+
will be presenting there -- see http://LoneStarRuby.org
|
25
|
+
|
26
|
+
<p>
|
27
|
+
As a bonus, there is a Phoenix training session on the day before. Wait, what? Phoenix
|
28
|
+
isn't Ruby. It's Elixir.
|
29
|
+
|
30
|
+
<p>
|
31
|
+
That's true. But Phoenix and Elixir are cool, too. And Jim Freeze who organizes LSRC
|
32
|
+
also put together the first Elixir Conference last year (and the upcoming one in 2015).
|
33
|
+
So we're keeping it in the family.
|
34
|
+
|
35
|
+
<p>
|
36
|
+
I hope to see you at <b>all three</b> of these events.
|
37
|
+
|
38
|
+
<p>
|
39
|
+
</div>
|
40
|
+
</article>
|
41
|
+
</body>
|
42
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.h1 Upcoming Lone Star Ruby Conference...
|
2
|
+
|
3
|
+
.set post.num = 0004
|
4
|
+
.set post.slug = upcoming-lone-star-ruby-conference
|
5
|
+
.set post.date = 2015-07-20
|
6
|
+
.set post.title = Upcoming Lone Star Ruby Conference...
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing austin
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
After a short hiatus, LSRC is back! Join us in Austin next month. Speakers have
|
13
|
+
just been announced.
|
14
|
+
I submitted a proposal, but it wasn't accepted this time. But many other fine people
|
15
|
+
will be presenting there -- see http://LoneStarRuby.org
|
16
|
+
|
17
|
+
As a bonus, there is a Phoenix training session on the day before. Wait, what? Phoenix
|
18
|
+
isn't Ruby. It's Elixir.
|
19
|
+
|
20
|
+
That's true. But Phoenix and Elixir are cool, too. And Jim Freeze who organizes LSRC
|
21
|
+
also put together the first Elixir Conference last year (and the upcoming one in 2015).
|
22
|
+
So we're keeping it in the family.
|
23
|
+
|
24
|
+
I hope to see you at all three of these events.
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Elixir Conf 2015 announced</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Elixir Conf 2015 announced">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-07-22">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Elixir Conf 2015 announced</h1>
|
16
|
+
<time datetime="2015-07-22">July 22, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
Elixir Conference 2015 will be in early October in Austin, Texas!
|
22
|
+
It's sure to be a great time. The CFP will be open until mid-August. You're
|
23
|
+
encouraged to submit.
|
24
|
+
|
25
|
+
<p>
|
26
|
+
Really looking forward to this one.
|
27
|
+
</div>
|
28
|
+
</article>
|
29
|
+
</body>
|
30
|
+
</html>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
.h1 Elixir Conf 2015 announced
|
2
|
+
|
3
|
+
.set post.num = 0005
|
4
|
+
.set post.slug = elixir-conf-2015-announced
|
5
|
+
.set post.date = 2015-07-22
|
6
|
+
.set post.title = Elixir Conf 2015 announced
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
Elixir Conference 2015 will be in early October in Austin, Texas!
|
13
|
+
It's sure to be a great time. The CFP will be open until mid-August. You're
|
14
|
+
encouraged to submit.
|
15
|
+
|
16
|
+
Really looking forward to this one.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Ruby for Dinosaurs...</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Ruby for Dinosaurs...">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-07-23">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Ruby for Dinosaurs...</h1>
|
16
|
+
<time datetime="2015-07-23">July 23, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
I have a good friend I've known since college. He was much older than I was (though
|
22
|
+
now somehow we are much closer together in age). He was a mentor to me with regard
|
23
|
+
to computers and other things.
|
24
|
+
He was a brilliant programmer and actually wrote a C compiler in the days before the
|
25
|
+
IBM PC. He's now past 70 if I am not mistaken. Lately, he says technical things make
|
26
|
+
him tired.
|
27
|
+
|
28
|
+
<p>
|
29
|
+
But as a Ruby enthusiast, I felt obligated to pass on some of the insights I had in
|
30
|
+
the last 16 years. Will it bring him out of retirement and get him to write code
|
31
|
+
again? Maybe not. But I had been meaning for years to write this little intro, and so
|
32
|
+
I finally did.
|
33
|
+
|
34
|
+
<p>
|
35
|
+
Here's the PDF of <a style='text-decoration: none' href='assets/rubydino.pdf'>"Ruby for the Old-Time C Programmer"</a>
|
36
|
+
|
37
|
+
<p>
|
38
|
+
If you know someone who thinks in C and never learned OOP, you might share it with
|
39
|
+
that person as well. If you have comments, feel free to email me.
|
40
|
+
</div>
|
41
|
+
</article>
|
42
|
+
</body>
|
43
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
.h1 Ruby for Dinosaurs...
|
2
|
+
|
3
|
+
.set post.num = 0006
|
4
|
+
.set post.slug = ruby-for-dinosaurs
|
5
|
+
.set post.date = 2015-07-23
|
6
|
+
.set post.title = Ruby for Dinosaurs...
|
7
|
+
.set post.tags =
|
8
|
+
.set post.views = computing
|
9
|
+
.set post.published = yes
|
10
|
+
.set post.deployed = no
|
11
|
+
|
12
|
+
I have a good friend I've known since college. He was much older than I was (though
|
13
|
+
now somehow we are much closer together in age). He was a mentor to me with regard
|
14
|
+
to computers and other things.
|
15
|
+
He was a brilliant programmer and actually wrote a C compiler in the days before the
|
16
|
+
IBM PC. He's now past 70 if I am not mistaken. Lately, he says technical things make
|
17
|
+
him tired.
|
18
|
+
|
19
|
+
But as a Ruby enthusiast, I felt obligated to pass on some of the insights I had in
|
20
|
+
the last 16 years. Will it bring him out of retirement and get him to write code
|
21
|
+
again? Maybe not. But I had been meaning for years to write this little intro, and so
|
22
|
+
I finally did.
|
23
|
+
|
24
|
+
Here's the PDF of "Ruby for the Old-Time C Programmer"
|
25
|
+
|
26
|
+
If you know someone who thinks in C and never learned OOP, you might share it with
|
27
|
+
that person as well. If you have comments, feel free to email me.
|
@@ -0,0 +1,116 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Phoenix isn't Rails</title>
|
6
|
+
<meta name="generator" content="Scriptorium Import">
|
7
|
+
<meta property="og:title" content="Phoenix isn't Rails">
|
8
|
+
<meta property="og:locale" content="en_US">
|
9
|
+
<meta property="og:type" content="article">
|
10
|
+
<meta property="article:published_time" content="2015-07-27">
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<article>
|
14
|
+
<header>
|
15
|
+
<h1>Phoenix isn't Rails</h1>
|
16
|
+
<time datetime="2015-07-27">July 27, 2015</time>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<div class="content">
|
20
|
+
<p>
|
21
|
+
I don't know Elixir very well at all. But I've started to learn Phoenix now. The
|
22
|
+
first thing to know: Phoenix is <i>not</i> Ruby on Rails (nor is it "Elixir on Rails").
|
23
|
+
I began my learning experience by dutifully crunching through the tutorial and
|
24
|
+
making my share (at least) of newbie mistakes. (Disclaimer: I'm not a web guy. I
|
25
|
+
don't natively "think" in those terms and perhaps never will.)
|
26
|
+
|
27
|
+
<p>
|
28
|
+
At some point in the hello-world example, I stopped and did a count of the files
|
29
|
+
under my tree. It will become clear in a moment why this was a little naive and
|
30
|
+
careless.
|
31
|
+
|
32
|
+
<p>
|
33
|
+
At any rate, I think <tt>find . | wc -l</tt>reported 11,648 files to me. I found this
|
34
|
+
a bit confusing and puzzling, and I didn't think it through.
|
35
|
+
|
36
|
+
<p>
|
37
|
+
I chatted with Chris McCord and another guy I don't think I've met. This is a summary:
|
38
|
+
|
39
|
+
<p>
|
40
|
+
<pre>
|
41
|
+
hal_9000: chrismccord: I have a question about the philosophy/design
|
42
|
+
of phoenix - if you have time/inclination and the answer is not too involved
|
43
|
+
|
44
|
+
chrismccord: hal_9000: shoot
|
45
|
+
|
46
|
+
hal_9000: first of all, i’m not a web guy - i’ve played with rails and several
|
47
|
+
other things - wrote a few small apps. One thing that appealed to me
|
48
|
+
about Sinatra was how “lightweight” it was compared to Rails — you can
|
49
|
+
write a primitive Sinatra app in a single file.
|
50
|
+
hal_9000: i “sort of” expected that Phoenix might be that way — but a find piped
|
51
|
+
to wc showed me that a hello-world app has more than 11,000 files in it.
|
52
|
+
why in general is that?
|
53
|
+
|
54
|
+
chrismccord: hal_9000: remove the node_modules folder and re-run ws
|
55
|
+
chrismccord: it's all nodejs for the asset building
|
56
|
+
chrismccord: hal_9000: we are lightweight. It's a misconception I have to keep correcting.
|
57
|
+
We are much closer to sinatra than rails
|
58
|
+
|
59
|
+
<p>
|
60
|
+
hal_9000: hmm, i don’t even know nodejs of course
|
61
|
+
hal_9000: chrismccord: thanks, i had a feeling i was missing something for sure
|
62
|
+
|
63
|
+
<p>
|
64
|
+
chrismccord: hal_9000: you could write an app in a single file, but no-one does that,
|
65
|
+
because we don't write production software in a single file
|
66
|
+
chrismccord: hal_9000: It is also worth mentioning there is also nothing global in
|
67
|
+
phoenix. We are not a monolith like rails
|
68
|
+
|
69
|
+
jeregrine: hal_9000: something to keep in mind here is that phoenix assumes you are
|
70
|
+
writing production software. Eventually you will need to touch every file, otherwise
|
71
|
+
it wouldn't generate the file
|
72
|
+
|
73
|
+
hal_9000: chrismccord: ok, thanks, i will look more closely. i’m impressed with what i see
|
74
|
+
|
75
|
+
jeregrine: hal_9000: if you are like me and have used sinatra for production software you
|
76
|
+
probably discovered you ended up writing a slightly smaller version of rails
|
77
|
+
|
78
|
+
<p>
|
79
|
+
hal_9000: jeregrine: that makes perfect sense
|
80
|
+
|
81
|
+
jeregrine: hal_9000: if you only need a single route/api call, and are certain it will never grow,
|
82
|
+
you could VERY easily get away with just plug and it's router
|
83
|
+
jeregrine: hal_9000: http://hexdocs.pm/plug/Plug.Router.html for reference.
|
84
|
+
|
85
|
+
hal_9000: chrismccord: i grasp it now, sorry for the noise
|
86
|
+
|
87
|
+
<p>
|
88
|
+
jeregrine: hal_9000: lemme know if you have any questions, this is something we need to be better at
|
89
|
+
communicating. We are not rails
|
90
|
+
|
91
|
+
<p>
|
92
|
+
chrismccord: hal_9000: no worries. Sorry if my response was rash too. I just have to fight a lot of
|
93
|
+
"phoenix is bloated" comments because people assume it is given my Rails background and
|
94
|
+
the comparisons with rails
|
95
|
+
|
96
|
+
<p>
|
97
|
+
hal_9000: chrismccord: no, your response was not rash at all
|
98
|
+
</pre>
|
99
|
+
|
100
|
+
<p>
|
101
|
+
So first of all: I didn't pay attention to what I was doing when I did my file count.
|
102
|
+
|
103
|
+
<p>
|
104
|
+
But the real takeaway here is: Phoenix isn't bloated, and more importantly, <i>Phoenix isn't Rails</i>.
|
105
|
+
The philosophy seems to be more "minimalistic" as I had hoped.
|
106
|
+
|
107
|
+
<p>
|
108
|
+
And of course, we all know that Elixir isn't Ruby. I won't belabor that point.
|
109
|
+
|
110
|
+
<p>
|
111
|
+
On the other hand, I do find (so far) that Plug is a lot like Rack. That's a good thing, because I
|
112
|
+
always thought Rack was sheer genius. More on that as I learn.
|
113
|
+
</div>
|
114
|
+
</article>
|
115
|
+
</body>
|
116
|
+
</html>
|