[{"nid":[{"value":162}],"uuid":[{"value":"00f7db21-b902-44ff-8c77-06142f74432b"}],"vid":[{"value":504}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2026-03-26T14:37:49+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Crab Rave"}],"created":[{"value":"2026-03-26T13:34:14+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2026-03-26T14:37:49+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":false}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/crab-rave","pid":121,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EOpen Claw is a brand new technology. \u0026nbsp;I\u0027ve only been using it for a couple of weeks now, so I\u0027m hardly an expert - but at this point, no one is. \u0026nbsp;Still, I hesitated to write about it - until I came across this:\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-ibcn.png\u0022 data-entity-uuid=\u0022747fe2cb-9a67-41f1-9156-ed679beed12f\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of a pull request\u0022 width=\u0022946\u0022 height=\u0022408\u0022\u003E\u003Cp\u003EThat\u0027s from a pull request that my AI submitted overnight. \u0026nbsp;But I\u0027m getting ahead of myself.\u003C\/p\u003E\u003Ch2\u003EHow I Got Here\u003C\/h2\u003E\u003Cp\u003EI almost didn\u0027t start. Open Claw is a hungry critter, and demands a server (either virtual or bare metal) with at least 2 GB of ram. \u0026nbsp;That\u0027s not a lot of you\u0027re an old laptop sitting in my garage, but it is a lot if you\u0027re a VPS (virtual private server) running in a Digital Ocean data center. \u0026nbsp;I\u0027m running this website - and half a dozen others - on a smaller VPS than that. \u0026nbsp;Was it really worth the extra monthly cost to invest in a larger server, just for a toy?\u003C\/p\u003E\u003Cp\u003EIf you\u0027re asking yourself the same question, the answer is \u003Cstrong\u003Eyes.\u003C\/strong\u003E\u003C\/p\u003E\u003Ch3\u003E1-Click Deploys\u003C\/h3\u003E\u003Cp\u003EDigital Ocean is great for several reasons: it\u0027s cheap, it has data centers in San Francisco, and most importantly, it has \u003Cem\u003Egreat documentation. \u003C\/em\u003EEven before I used Digital Ocean, I was using their docs for things like setting up your own mail server (not recommended). \u0026nbsp;So it\u0027s no surprise that they have \u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-run-openclaw\u0022\u003Egreat documentation for getting started with Open Claw\u003C\/a\u003E. \u0026nbsp;Even better, they\u0027ve cooked up a \u003Cstrong\u003E1-click solution\u003C\/strong\u003E. \u0026nbsp;You literally just pay for the size VPS you want (starting at $12\/month), choose the installation image (in my case, Open Claw), and the robots do the rest. \u0026nbsp;You get a VPS with Open Claw running sandboxed in a Docker container \u003Cem\u003Einside the VPS\u003C\/em\u003E - so there are multiple layers of security.\u003C\/p\u003E\u003Cp\u003EI discovered quickly that it\u0027s \u003Cem\u003Etoo much \u003C\/em\u003Esecurity. \u0026nbsp;Because it\u0027s inside a Docker container, it\u0027s \u003Cem\u003Eephemeral;\u003C\/em\u003E changes you make won\u0027t survive to the next restart (which happens often, at first). \u0026nbsp;This is really just for poking around and getting used to the UI, which is surprisingly polished and elegant. \u0026nbsp;But it\u0027s hard to even load skills or store api keys, which you will need to connect to other services.\u003C\/p\u003E\u003Ch3\u003ERolling Your Own\u003C\/h3\u003E\u003Cp\u003ENext step: install Open Claw yourself, on a fresh VPS. \u0026nbsp;Why fresh? \u0026nbsp;Because, once you take this step, you immediately need to think about \u003Cstrong\u003Eguardrails.\u003C\/strong\u003E You are literally letting an agentic AI loose in the real world, either on an old laptop you had lying around, or a mobile device (it works great on iOS), or on a VPS. \u0026nbsp;Once you give it your api keys and connect it to services, you are giving it permission to do things to your real life, like your email or calendar. \u0026nbsp;I could write a whole post just on this, but others have already done it. \u0026nbsp;All I\u0027ll say is \u003Cstrong\u003Ebe careful.\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003EThe article above \u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-run-openclaw\u0022\u003Eincludes instructions\u003C\/a\u003E for this option as well, since they know a lot of people are going to try it. \u0026nbsp;The instructions are worth following. \u0026nbsp;Installation is simple, if you\u0027ve ever used Bash, or a package manager (eg. npm). \u0026nbsp;The only other trick is \u003Cstrong\u003Eenvironment variables,\u003C\/strong\u003E which Digital Ocean does not handle as well as I\u0027d like (there\u0027s no variable injection for virtual private servers). \u0026nbsp;Since I\u0027m storing all my data to a \u003Cem\u003Eprivate \u003C\/em\u003Erepository, I opted for the least secure option: storing my passwords and keys in plain text. \u0026nbsp;Not a good idea, but it gets me there faster.\u003C\/p\u003E\u003Cp\u003EOnce Open Claw is installed, starting it is simple: you run \u003Cstrong\u003Eopenclaw tui\u003C\/strong\u003E from the command line. \u0026nbsp;The config wizard will walk you through the rest. \u0026nbsp;I ran openclaw as \u003Cstrong\u003Eroot\u003C\/strong\u003E, which is another bad idea - but since it\u0027s on an isolated VPS, I didn\u0027t want to worry about user accounts. \u0026nbsp;I wanted my openclaw to be able to write config and install software, so it needed root access anyway.\u003C\/p\u003E\u003Cp\u003EThere is a web UI, of course, and it\u0027s lovely. \u0026nbsp;It comes in three colors, and supports dark mode (of course). \u0026nbsp;There\u0027s a built-in chat, plus config options, and you can monitor things like cron jobs and api usage (I like to keep an eye on the cost of my experiments).\u003C\/p\u003E\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-ijva.png\u0022 data-entity-uuid=\u00222fd467fd-80da-48dc-8da7-127320ba208b\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of the web UI\u0022 width=\u00222548\u0022 height=\u00221638\u0022\u003E\u003C\/p\u003E\u003Cp\u003EYou\u0027ll need \u003Cstrong\u003Eapi keys, \u003C\/strong\u003Eof course. \u0026nbsp;In addition to \u003Cstrong\u003EAnthropic\u003C\/strong\u003E and \u003Cstrong\u003EOpenAI, \u003C\/strong\u003EI grabbed api keys from Discord, WhatsApp, Github, and Google. \u0026nbsp;The last one gives Open Claw access to my emails and calendar... but we\u0027re not there yet!\u003C\/p\u003E\u003Cp\u003EOpen Claw\u0027s biggest power is its \u003Cem\u003Eexpandability\u003C\/em\u003E. It\u0027s free, open source, and \u003Cem\u003Eextendable. \u0026nbsp;\u003C\/em\u003EThis means you can add both \u003Cstrong\u003Eskills, \u003C\/strong\u003Eand \u003Cstrong\u003Eplugins\u003C\/strong\u003E. \u0026nbsp;Skills are simple text files written in markdown, and plugins are a little more sophisticated. \u0026nbsp;Both extend Open Claw\u0027s abilities; the connection to both Github and Google are provided by skills. \u0026nbsp;I added another skill to generate powerpoint presentations.\u003C\/p\u003E\u003Cp\u003EFinally - and you may not care about this - Open Claw claims that its AI can have \u0022personality.\u0022 \u0026nbsp;The creator was seeking a companion, not just a dull robot who could perform commands. \u0026nbsp;Open Claw makes suggestions and will even advise you against a potentially dangerous action. \u0026nbsp;It also editorializes, just a little bit, as you can see from the PR above.\u003C\/p\u003E\u003Ch2\u003EEntertain Me\u003C\/h2\u003E\u003Cp\u003EOK. \u0026nbsp;I\u0027m paying $12\/mo for a potentially dangerous AI agent that has access to my real, personal data. \u0026nbsp;What now? \u0026nbsp;\u003Cem\u003ELet\u0027s have some fun.\u003C\/em\u003E\u003C\/p\u003E\u003Ch3\u003ESoftware Updates on Github\u003C\/h3\u003E\u003Cp\u003EI used the built-in Github skill, and asked Open Claw to download the git repository for my professional website (the one you\u0027re reading now). \u0026nbsp;It\u0027s a monorepo that requires both a full LAMP stack, and Node.js, but Open Claw doesn\u0027t need any of that. My request was:\u003C\/p\u003E\u003Cul\u003E\u003Cli data-list-item-id=\u0022e27499dd825ef21940db046dee70c38a7\u0022\u003EFind the community-contributed Drupal module named \u0027AI\u0027\u003C\/li\u003E\u003Cli data-list-item-id=\u0022e23f2b5e1d313b1be73c22fca857832bd\u0022\u003EUse Composer to update the module to the latest stable version\u003C\/li\u003E\u003Cli data-list-item-id=\u0022e8343a2956b1b041cca84716ef9da1288\u0022\u003EPush to my git repository and create a pull request\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EAnd the AI \u003Cem\u003Edid it.\u003C\/em\u003E This stuff is powerful.\u003C\/p\u003E\u003Ch3\u003EUn-Clutter My Schedule\u003C\/h3\u003E\u003Cp\u003EI spent the past week at Drupalcon in Chicago. \u0026nbsp;It was a fantastic time, but my schedule on Wednesday was messy. \u0026nbsp;I once again turned to the AI, this time with the \u0022gog\u0022 skill. \u0026nbsp;This is another built-in skill, which requires an api key from Google. \u0026nbsp;Google offers very granular level access, so you can choose exactly what you want to allow. \u0026nbsp;I am allowing Open Claw access to my calendar and email. \u0026nbsp;But on Wednesday, I had four schedules:\u003C\/p\u003E\u003Col\u003E\u003Cli data-list-item-id=\u0022ec3cd7b1e0c5981d265c5f3add5164609\u0022\u003EThe official Drupalcon session schedule\u003C\/li\u003E\u003Cli data-list-item-id=\u0022edaa472c2861dba8dfd086d5a219da8c8\u0022\u003EThe \u0022Birds of a Feather\u0022 talks\u003C\/li\u003E\u003Cli data-list-item-id=\u0022e5841ff3e49a70c5656580aa3d6b77614\u0022\u003EMy work calendar (including meetings)\u003C\/li\u003E\u003Cli data-list-item-id=\u0022e5e6e5538c285da00148d75e880da748b\u0022\u003EMy personal calendar (card night with friends)\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EIn addition, my own schedule was in Pacific time, while the Drupalcon schedules were in Central Time. \u0026nbsp;Could the AI combine all those sources into a single coherent schedule? \u0026nbsp;Here\u0027s what I got:\u003C\/p\u003E\u003Cimg data-entity-uuid=\u00226d798990-fada-4bf4-b21c-bee12f2fe7d6\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-iqyc.png\u0022 width=\u0022680\u0022 height=\u0022590\u0022 alt=\u0022Jordan\u0026apos;s schedule for Wednesday\u0022\u003E\u003Cp\u003EHere\u0027s my schedule, in chronological order, from four different sources, accounting for time zones, \u003Cem\u003Eand daylight savings.\u003C\/em\u003E\u003C\/p\u003E\u003Ch3\u003EWhat Else?\u003C\/h3\u003E\u003Cp\u003EI\u0027ve connected my AI to a group chat on Discord. \u0026nbsp;There, it tells jokes and rolls dice for my friends. \u0026nbsp;I\u0027ve used it to illustrate images. \u0026nbsp;I run a nightly backup to github, just in case I break the server (which has already happened).\u003C\/p\u003E\u003Cimg data-entity-uuid=\u0022377566a4-907a-46b6-9933-7133f480d88c\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/treif-network.png.jpeg\u0022 width=\u00221024\u0022 height=\u00221024\u0022 alt=\u0022network map\u0022\u003E\u003Cp\u003EAnd I feel I\u0027m just scratching the surface.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EOpen Claw is a brand new technology. \u0026nbsp;I\u0027ve only been using it for a couple of weeks now, so I\u0027m hardly an expert - but at this point, no one is. \u0026nbsp;Still, I hesitated to write about it - until I came across this:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-ibcn.png\u0022 data-entity-uuid=\u0022747fe2cb-9a67-41f1-9156-ed679beed12f\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of a pull request\u0022 width=\u0022946\u0022 height=\u0022408\u0022\u003E\n\u003Cp\u003EThat\u0027s from a pull request that my AI submitted overnight. \u0026nbsp;But I\u0027m getting ahead of myself.\u003C\/p\u003E\n\u003Ch2\u003EHow I Got Here\u003C\/h2\u003E\n\u003Cp\u003EI almost didn\u0027t start. Open Claw is a hungry critter, and demands a server (either virtual or bare metal) with at least 2 GB of ram. \u0026nbsp;That\u0027s not a lot of you\u0027re an old laptop sitting in my garage, but it is a lot if you\u0027re a VPS (virtual private server) running in a Digital Ocean data center. \u0026nbsp;I\u0027m running this website - and half a dozen others - on a smaller VPS than that. \u0026nbsp;Was it really worth the extra monthly cost to invest in a larger server, just for a toy?\u003C\/p\u003E\n\u003Cp\u003EIf you\u0027re asking yourself the same question, the answer is \u003Cstrong\u003Eyes.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Ch3\u003E1-Click Deploys\u003C\/h3\u003E\n\u003Cp\u003EDigital Ocean is great for several reasons: it\u0027s cheap, it has data centers in San Francisco, and most importantly, it has \u003Cem\u003Egreat documentation. \u003C\/em\u003EEven before I used Digital Ocean, I was using their docs for things like setting up your own mail server (not recommended). \u0026nbsp;So it\u0027s no surprise that they have \u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-run-openclaw\u0022\u003Egreat documentation for getting started with Open Claw\u003C\/a\u003E. \u0026nbsp;Even better, they\u0027ve cooked up a \u003Cstrong\u003E1-click solution\u003C\/strong\u003E. \u0026nbsp;You literally just pay for the size VPS you want (starting at $12\/month), choose the installation image (in my case, Open Claw), and the robots do the rest. \u0026nbsp;You get a VPS with Open Claw running sandboxed in a Docker container \u003Cem\u003Einside the VPS\u003C\/em\u003E - so there are multiple layers of security.\u003C\/p\u003E\n\u003Cp\u003EI discovered quickly that it\u0027s \u003Cem\u003Etoo much \u003C\/em\u003Esecurity. \u0026nbsp;Because it\u0027s inside a Docker container, it\u0027s \u003Cem\u003Eephemeral;\u003C\/em\u003E changes you make won\u0027t survive to the next restart (which happens often, at first). \u0026nbsp;This is really just for poking around and getting used to the UI, which is surprisingly polished and elegant. \u0026nbsp;But it\u0027s hard to even load skills or store api keys, which you will need to connect to other services.\u003C\/p\u003E\n\u003Ch3\u003ERolling Your Own\u003C\/h3\u003E\n\u003Cp\u003ENext step: install Open Claw yourself, on a fresh VPS. \u0026nbsp;Why fresh? \u0026nbsp;Because, once you take this step, you immediately need to think about \u003Cstrong\u003Eguardrails.\u003C\/strong\u003E You are literally letting an agentic AI loose in the real world, either on an old laptop you had lying around, or a mobile device (it works great on iOS), or on a VPS. \u0026nbsp;Once you give it your api keys and connect it to services, you are giving it permission to do things to your real life, like your email or calendar. \u0026nbsp;I could write a whole post just on this, but others have already done it. \u0026nbsp;All I\u0027ll say is \u003Cstrong\u003Ebe careful.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EThe article above \u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-run-openclaw\u0022\u003Eincludes instructions\u003C\/a\u003E for this option as well, since they know a lot of people are going to try it. \u0026nbsp;The instructions are worth following. \u0026nbsp;Installation is simple, if you\u0027ve ever used Bash, or a package manager (eg. npm). \u0026nbsp;The only other trick is \u003Cstrong\u003Eenvironment variables,\u003C\/strong\u003E which Digital Ocean does not handle as well as I\u0027d like (there\u0027s no variable injection for virtual private servers). \u0026nbsp;Since I\u0027m storing all my data to a \u003Cem\u003Eprivate \u003C\/em\u003Erepository, I opted for the least secure option: storing my passwords and keys in plain text. \u0026nbsp;Not a good idea, but it gets me there faster.\u003C\/p\u003E\n\u003Cp\u003EOnce Open Claw is installed, starting it is simple: you run \u003Cstrong\u003Eopenclaw tui\u003C\/strong\u003E from the command line. \u0026nbsp;The config wizard will walk you through the rest. \u0026nbsp;I ran openclaw as \u003Cstrong\u003Eroot\u003C\/strong\u003E, which is another bad idea - but since it\u0027s on an isolated VPS, I didn\u0027t want to worry about user accounts. \u0026nbsp;I wanted my openclaw to be able to write config and install software, so it needed root access anyway.\u003C\/p\u003E\n\u003Cp\u003EThere is a web UI, of course, and it\u0027s lovely. \u0026nbsp;It comes in three colors, and supports dark mode (of course). \u0026nbsp;There\u0027s a built-in chat, plus config options, and you can monitor things like cron jobs and api usage (I like to keep an eye on the cost of my experiments).\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-ijva.png\u0022 data-entity-uuid=\u00222fd467fd-80da-48dc-8da7-127320ba208b\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of the web UI\u0022 width=\u00222548\u0022 height=\u00221638\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EYou\u0027ll need \u003Cstrong\u003Eapi keys, \u003C\/strong\u003Eof course. \u0026nbsp;In addition to \u003Cstrong\u003EAnthropic\u003C\/strong\u003E and \u003Cstrong\u003EOpenAI, \u003C\/strong\u003EI grabbed api keys from Discord, WhatsApp, Github, and Google. \u0026nbsp;The last one gives Open Claw access to my emails and calendar... but we\u0027re not there yet!\u003C\/p\u003E\n\u003Cp\u003EOpen Claw\u0027s biggest power is its \u003Cem\u003Eexpandability\u003C\/em\u003E. It\u0027s free, open source, and \u003Cem\u003Eextendable. \u0026nbsp;\u003C\/em\u003EThis means you can add both \u003Cstrong\u003Eskills, \u003C\/strong\u003Eand \u003Cstrong\u003Eplugins\u003C\/strong\u003E. \u0026nbsp;Skills are simple text files written in markdown, and plugins are a little more sophisticated. \u0026nbsp;Both extend Open Claw\u0027s abilities; the connection to both Github and Google are provided by skills. \u0026nbsp;I added another skill to generate powerpoint presentations.\u003C\/p\u003E\n\u003Cp\u003EFinally - and you may not care about this - Open Claw claims that its AI can have \u0022personality.\u0022 \u0026nbsp;The creator was seeking a companion, not just a dull robot who could perform commands. \u0026nbsp;Open Claw makes suggestions and will even advise you against a potentially dangerous action. \u0026nbsp;It also editorializes, just a little bit, as you can see from the PR above.\u003C\/p\u003E\n\u003Ch2\u003EEntertain Me\u003C\/h2\u003E\n\u003Cp\u003EOK. \u0026nbsp;I\u0027m paying $12\/mo for a potentially dangerous AI agent that has access to my real, personal data. \u0026nbsp;What now? \u0026nbsp;\u003Cem\u003ELet\u0027s have some fun.\u003C\/em\u003E\u003C\/p\u003E\n\u003Ch3\u003ESoftware Updates on Github\u003C\/h3\u003E\n\u003Cp\u003EI used the built-in Github skill, and asked Open Claw to download the git repository for my professional website (the one you\u0027re reading now). \u0026nbsp;It\u0027s a monorepo that requires both a full LAMP stack, and Node.js, but Open Claw doesn\u0027t need any of that. My request was:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli data-list-item-id=\u0022e27499dd825ef21940db046dee70c38a7\u0022\u003EFind the community-contributed Drupal module named \u0027AI\u0027\u003C\/li\u003E\n\u003Cli data-list-item-id=\u0022e23f2b5e1d313b1be73c22fca857832bd\u0022\u003EUse Composer to update the module to the latest stable version\u003C\/li\u003E\n\u003Cli data-list-item-id=\u0022e8343a2956b1b041cca84716ef9da1288\u0022\u003EPush to my git repository and create a pull request\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAnd the AI \u003Cem\u003Edid it.\u003C\/em\u003E This stuff is powerful.\u003C\/p\u003E\n\u003Ch3\u003EUn-Clutter My Schedule\u003C\/h3\u003E\n\u003Cp\u003EI spent the past week at Drupalcon in Chicago. \u0026nbsp;It was a fantastic time, but my schedule on Wednesday was messy. \u0026nbsp;I once again turned to the AI, this time with the \u0022gog\u0022 skill. \u0026nbsp;This is another built-in skill, which requires an api key from Google. \u0026nbsp;Google offers very granular level access, so you can choose exactly what you want to allow. \u0026nbsp;I am allowing Open Claw access to my calendar and email. \u0026nbsp;But on Wednesday, I had four schedules:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli data-list-item-id=\u0022ec3cd7b1e0c5981d265c5f3add5164609\u0022\u003EThe official Drupalcon session schedule\u003C\/li\u003E\n\u003Cli data-list-item-id=\u0022edaa472c2861dba8dfd086d5a219da8c8\u0022\u003EThe \u0022Birds of a Feather\u0022 talks\u003C\/li\u003E\n\u003Cli data-list-item-id=\u0022e5841ff3e49a70c5656580aa3d6b77614\u0022\u003EMy work calendar (including meetings)\u003C\/li\u003E\n\u003Cli data-list-item-id=\u0022e5e6e5538c285da00148d75e880da748b\u0022\u003EMy personal calendar (card night with friends)\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EIn addition, my own schedule was in Pacific time, while the Drupalcon schedules were in Central Time. \u0026nbsp;Could the AI combine all those sources into a single coherent schedule? \u0026nbsp;Here\u0027s what I got:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg data-entity-uuid=\u00226d798990-fada-4bf4-b21c-bee12f2fe7d6\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260326-iqyc.png\u0022 width=\u0022680\u0022 height=\u0022590\u0022 alt=\u0022Jordan\u0027s schedule for Wednesday\u0022\u003E\n\u003Cp\u003EHere\u0027s my schedule, in chronological order, from four different sources, accounting for time zones, \u003Cem\u003Eand daylight savings.\u003C\/em\u003E\u003C\/p\u003E\n\u003Ch3\u003EWhat Else?\u003C\/h3\u003E\n\u003Cp\u003EI\u0027ve connected my AI to a group chat on Discord. \u0026nbsp;There, it tells jokes and rolls dice for my friends. \u0026nbsp;I\u0027ve used it to illustrate images. \u0026nbsp;I run a nightly backup to github, just in case I break the server (which has already happened).\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg data-entity-uuid=\u0022377566a4-907a-46b6-9933-7133f480d88c\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/treif-network.png.jpeg\u0022 width=\u00221024\u0022 height=\u00221024\u0022 alt=\u0022network map\u0022\u003E\n\u003Cp\u003EAnd I feel I\u0027m just scratching the surface.\u003C\/p\u003E\n","summary":"In which I learn to love Open Claw"}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1774532696,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":397,"alt":"illustration of crabs, lobsters, and other shellfish having a dance party","title":"","width":1536,"height":1024,"target_type":"file","target_uuid":"d9836652-a89c-42b9-990d-6efe231d65d0","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/shellfish-rave.png.jpeg"}],"field_tags":[]},{"nid":[{"value":124}],"uuid":[{"value":"1a090f7a-2b1e-4e2f-a11f-ff334a50f1d5"}],"vid":[{"value":464}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2026-01-01T18:44:05+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"From the Mailbag: Embedding Content"}],"created":[{"value":"2026-01-01T18:11:13+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2026-01-01T18:44:05+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/mailbag-embedding-content","pid":120,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EI was recently pleased to find a letter come through via the \u003Ca href=\u0022\/contact\u0022\u003Econtact page\u003C\/a\u003E on my own website. \u0026nbsp;It reads:\u003C\/p\u003E\u003Cp style=\u0022-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-left:4px solid rgb(208, 208, 208);color:rgb(34, 34, 34);font-family:Arial, Helvetica, sans-serif;font-size:small;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;padding:12px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;\u0022\u003E\u003Cem\u003EHi there, I was at Badcamp and am working through the tutorial to add an AI Chatbot. I noticed that in my embeddings strategy it only lets me choose one Main Content field. Would you recommend I use the block body, or the content body field? Is this something I can change to allow more than one field? What does contextual content mean if I use that for the rest?\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EHi, Chris! \u0026nbsp;I\u0027m glad you enjoyed \u003Ca href=\u0022https:\/\/youtu.be\/ABm5HY9vgu8?si=LfdYTwGiXmm6hTQ8\u0022\u003Emy talk\u003C\/a\u003E. \u0026nbsp;Embedding is important, and I glossed over it in my presentation. \u0026nbsp;Here are the answers to your questions:\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EWould you recommend I use the block body, or the content body field?\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003EShort answer: content body field.\u003C\/p\u003E\u003Cp\u003ELonger answer: It depends on your real content! \u0026nbsp;If you\u0027re using the Umami demo content, like I did, then you might want to actually use the instructions, rather than the body text, as your \u0022main content.\u0022\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003EWhat is main content? \u003C\/em\u003ERemember my slide depicting the vector database?\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260101-jqzf.jpeg\u0022 data-entity-uuid=\u002209aa2466-c2b1-4ff9-b870-154a8b427e90\u0022 data-entity-type=\u0022file\u0022 alt=\u0022a robot looking at a vector database\u0022 width=\u00221900\u0022 height=\u0022870\u0022\u003E\u003Cp\u003EVector dbs are not like normal dbs you might have used before; they measure \u003Cem\u003Econceptual relationships \u003C\/em\u003Ebetween different words or short phrases. \u0026nbsp;You need to \u0022chop up\u0022 your content in order to feed it into the vector db, and luckily Drupal is good at that; all content in Drupal is already stored in a \u003Cem\u003Erelational database, \u003C\/em\u003Ewhich means relationships between different things are already established. \u0026nbsp;When you use the search api module, it automatically takes advantage of this ability.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EIs this something I can change to allow more than one field?\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003EShort answer: No.\u003C\/p\u003E\u003Cp\u003ELonger answer: No - and you don\u0027t want to. \u0026nbsp;When you designate a single field as the \u0022primary content,\u0022 you\u0027re telling the embedding service (in my case, Pinecone) to focus its power on that field. \u0026nbsp;Whatever that field says, you should draw relationships from that.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EWhat does contextual content mean if I use that for the rest?\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003EShort answer: Contextual content is good, you want to flag as many fields as you can that way.\u003C\/p\u003E\u003Cp\u003ELonger answer: Still the same, but be careful; it really depends on your actual use case. \u0026nbsp;You don\u0027t want to index everything in a vector db, only the things that are logically relevant to your use case. \u0026nbsp;If you\u0027re using the Umami demo content, then your use case is recipes, and creating a chatbot that can talk about recipes. \u0026nbsp;In that case, you should ignore the \u0022created by\u0022 field, for example, since your chatbot doesn\u0027t care \u003Cem\u003Ewho\u003C\/em\u003E created\u003Cem\u003E \u003C\/em\u003Ea recipe. \u0026nbsp;(Or does it...?)\u003C\/p\u003E\u003Cdrupal-media data-entity-type=\u0022media\u0022 data-entity-uuid=\u0022ce07d4e2-b965-4a5b-b9be-192021918644\u0022\u003E\u0026nbsp;\u003C\/drupal-media\u003E","format":"full_html","processed":"\u003Cp\u003EI was recently pleased to find a letter come through via the \u003Ca href=\u0022\/contact\u0022\u003Econtact page\u003C\/a\u003E on my own website. \u0026nbsp;It reads:\u003C\/p\u003E\n\u003Cp style=\u0022-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-left:4px solid rgb(208, 208, 208);color:rgb(34, 34, 34);font-family:Arial, Helvetica, sans-serif;font-size:small;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;orphans:2;padding:12px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;\u0022\u003E\u003Cem\u003EHi there, I was at Badcamp and am working through the tutorial to add an AI Chatbot. I noticed that in my embeddings strategy it only lets me choose one Main Content field. Would you recommend I use the block body, or the content body field? Is this something I can change to allow more than one field? What does contextual content mean if I use that for the rest?\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EHi, Chris! \u0026nbsp;I\u0027m glad you enjoyed \u003Ca href=\u0022https:\/\/youtu.be\/ABm5HY9vgu8?si=LfdYTwGiXmm6hTQ8\u0022\u003Emy talk\u003C\/a\u003E. \u0026nbsp;Embedding is important, and I glossed over it in my presentation. \u0026nbsp;Here are the answers to your questions:\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWould you recommend I use the block body, or the content body field?\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EShort answer: content body field.\u003C\/p\u003E\n\u003Cp\u003ELonger answer: It depends on your real content! \u0026nbsp;If you\u0027re using the Umami demo content, like I did, then you might want to actually use the instructions, rather than the body text, as your \u0022main content.\u0022\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EWhat is main content? \u003C\/em\u003ERemember my slide depicting the vector database?\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20260101-jqzf.jpeg\u0022 data-entity-uuid=\u002209aa2466-c2b1-4ff9-b870-154a8b427e90\u0022 data-entity-type=\u0022file\u0022 alt=\u0022a robot looking at a vector database\u0022 width=\u00221900\u0022 height=\u0022870\u0022\u003E\n\u003C\/p\u003E\u003Cp\u003EVector dbs are not like normal dbs you might have used before; they measure \u003Cem\u003Econceptual relationships \u003C\/em\u003Ebetween different words or short phrases. \u0026nbsp;You need to \u0022chop up\u0022 your content in order to feed it into the vector db, and luckily Drupal is good at that; all content in Drupal is already stored in a \u003Cem\u003Erelational database, \u003C\/em\u003Ewhich means relationships between different things are already established. \u0026nbsp;When you use the search api module, it automatically takes advantage of this ability.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EIs this something I can change to allow more than one field?\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EShort answer: No.\u003C\/p\u003E\n\u003Cp\u003ELonger answer: No - and you don\u0027t want to. \u0026nbsp;When you designate a single field as the \u0022primary content,\u0022 you\u0027re telling the embedding service (in my case, Pinecone) to focus its power on that field. \u0026nbsp;Whatever that field says, you should draw relationships from that.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWhat does contextual content mean if I use that for the rest?\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EShort answer: Contextual content is good, you want to flag as many fields as you can that way.\u003C\/p\u003E\n\u003Cp\u003ELonger answer: Still the same, but be careful; it really depends on your actual use case. \u0026nbsp;You don\u0027t want to index everything in a vector db, only the things that are logically relevant to your use case. \u0026nbsp;If you\u0027re using the Umami demo content, then your use case is recipes, and creating a chatbot that can talk about recipes. \u0026nbsp;In that case, you should ignore the \u0022created by\u0022 field, for example, since your chatbot doesn\u0027t care \u003Cem\u003Ewho\u003C\/em\u003E created\u003Cem\u003E \u003C\/em\u003Ea recipe. \u0026nbsp;(Or does it...?)\u003C\/p\u003E\n\u003Cdiv class=\u0022media media--type-video media--view-mode-default\u0022\u003E\n  \n      \n  \u003Cdiv class=\u0022field field--name-field-media-video-file field--type-file field--label-visually_hidden\u0022\u003E\n    \u003Cdiv class=\u0022field__label visually-hidden\u0022\u003EVideo file\u003C\/div\u003E\n              \u003Cdiv class=\u0022field__item\u0022\u003E\u003Cvideo controls=\u0022controls\u0022 width=\u0022640\u0022 height=\u0022480\u0022\u003E\n      \u003Csource src=\u0022\/sites\/default\/files\/2026-01\/19700121_0254_6956bfe8f0948191a331718cf2feb0a2.mp4\u0022 type=\u0022video\/mp4\u0022\u003E\n  \u003C\/video\u003E\n\u003C\/div\u003E\n          \u003C\/div\u003E\n\n  \u003C\/div\u003E\n","summary":"I was recently pleased to find a letter come through via the contact page on my own website."}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1767292342,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":363,"alt":"a robot looking at a vector database","title":"","width":1900,"height":870,"target_type":"file","target_uuid":"cb884b99-a0f0-4f62-af88-cd949ac67378","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/SCR-20260101-jqzf.jpeg"}],"field_tags":[]},{"nid":[{"value":95}],"uuid":[{"value":"fcf59198-1dea-46d5-97ae-e35dc6687a24"}],"vid":[{"value":433}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-12-11T02:37:13+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"New Module: AI Deep Reference"}],"created":[{"value":"2025-12-10T16:21:04+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-12-11T02:37:13+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/new-module-ai-deep-reference","pid":119,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EI\u2019m proud to announce my latest contribution to the Drupal AI ecosystem: the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003EAI Deep Reference\u003C\/a\u003E module. \u0026nbsp;The purpose of this module is to help populate queries, so an AI can draw an image (or even a video). \u0026nbsp;It relies entirely on the existing \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI\u003C\/a\u003E ecosystem, and acts as a \u201cglue\u201d with the token module, to provide deeper references than the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/token\u0022\u003EToken\u003C\/a\u003E module can on its own.\u003C\/p\u003E\u003Cp\u003EThe module itself is not complicated; it simply hooks into the existing Token architecture, and reads the \u201cdescription\u201d field from a taxonomy term. \u0026nbsp;(By default, all taxonomy terms have a description, so you would have to engage in some shenanigans for this module not to work.)\u003C\/p\u003E\u003Ch2\u003EWhy Build This?\u003C\/h2\u003E\u003Cp\u003EMy motivation was actually a weekly Dungeons \u0026amp; Dragons session. \u0026nbsp;My friend \u003Ca href=\u0022https:\/\/www.linkedin.com\/in\/james-d-bunting\/\u0022\u003EJim\u003C\/a\u003E started these sessions during the pandemic, and \u003Ca href=\u0022https:\/\/www.linkedin.com\/in\/paul-peterson-8939355\/\u0022\u003EPaul\u003C\/a\u003E has continued to carry the flame. \u0026nbsp;My job is simple: the soundtrack. \u0026nbsp;I\u2019m responsible for injecting music into our Discord channel. \u0026nbsp;But what is music\u2026 without a little visual ambiance? \u0026nbsp;Enter the AI. \u0026nbsp;I\u2019ve been using OpenAI to generate images for our D\u0026amp;D sessions since Dall-E v2 (that\u2019s ancient, by AI reckoning).\u003C\/p\u003E\u003Cp\u003ESo what\u2019s the problem? \u0026nbsp;After months of being in the same adventuring party, I\u2019m getting sick of writing the same query over and over. \u0026nbsp;An armored bear carrying an enchanted flail. \u0026nbsp;A male elvish archer - because the AI always defaults to female, if you don\u2019t specify. \u0026nbsp;(I\u2019ll save the editorializing for another day.)\u003C\/p\u003E\u003Cp\u003EThe solution, of course, is Drupal.\u003C\/p\u003E\u003Cp\u003EIn particular, I want an AI generator that \u201cremembers\u201d my adventuring party, the setting, and maybe some additional details. \u0026nbsp;At the end of 2025, it\u2019s amazing how far the AI ecosystem has come in Drupal. \u0026nbsp;I was able to build almost the entire stack using community-contributed modules:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EThe AI core module (of course)\u003C\/li\u003E\u003Cli\u003EAI Automators (comes with the AI module)\u003C\/li\u003E\u003Cli\u003EToken\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_provider_openai\u0022\u003EOpenAI provider\u003C\/a\u003E, because ChatGPT is my poison of choice\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_media_image\u0022\u003EAI Media Image\u003C\/a\u003E, for integration with the media module\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThe media module integration is not necessary, but I found it helpful; older implementations had a tendency to fill up my server hard drive, which is\u2026 sub-optimal.\u003C\/p\u003E\u003Cp\u003EMy architecture is simple: a content type, a few taxonomies, and a single AI automator. \u0026nbsp;The automator is the secret ingredient; with it, I can grab the text fields, and generate my own AI query, using the taxonomy terms as variables.\u003C\/p\u003E\u003Cp\u003EAs you\u2019re adding your media field, be sure to add the AI automator.\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20251210-iact.png\u0022 data-entity-uuid=\u0022beeb9083-def9-491b-af77-671fd98ccfbe\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of AI Automator in use\u0022 width=\u00222244\u0022 height=\u00221770\u0022\u003E\u003Cp\u003EThe automator query takes plain English instruction, but we will add integration with the Token module. \u0026nbsp;This lets us grab the taxonomy terms from our other fields, and inject them in our query.\u003C\/p\u003E\u003Cp\u003EBut here\u2019s the limitation: with the Token module, you only get the taxonomy names. \u0026nbsp;What if you want to add a description? \u0026nbsp;The token module won\u2019t inject that into your query.\u003C\/p\u003E\u003Cp\u003EEnter my module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003EAI Deep Reference\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EThe premise is simple: it extends the Token module, and allows the AI Automator to read the description on the taxonomy term.\u003C\/p\u003E\u003Cp\u003EThe implementation is simple as well; there\u2019s an implementation of hook_token() which checks for taxonomy terms, and then injects the value of the description field. \u0026nbsp;You can see the whole thing here: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003Ehttps:\/\/www.drupal.org\/project\/ai_dr\u003C\/a\u003E\u003C\/p\u003E\u003Ch2\u003EWhat\u2019s Next?\u003C\/h2\u003E\u003Cp\u003EHow about a recipe? \u0026nbsp;I just described my fancy DnD illustrator; maybe others would want to use it too? \u0026nbsp;Should I open my own illustrator to the public? \u0026nbsp;It would have to be ad supported, as those api bills do add up. \u0026nbsp;What about extending the module further, to work with any field attached to a taxonomy term? \u0026nbsp;Or other entity types?\u003C\/p\u003E\u003Cp\u003EI don\u2019t allow comments on my new blog (too many spammers), but if you\u2019ve read this far, let me know what you think! \u0026nbsp;LinkedIn is always a good choice (I\u2019ll post this blog on my wall).\u003C\/p\u003E\u003Cp\u003EAs always, it feels good to release a module. \u0026nbsp;Giving back to the community makes my open-source heart go pitter-pat. \u0026nbsp;(No, really; it\u2019s called the \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Human_Genome_Project\u0022\u003EHuman Genome Project\u003C\/a\u003E.)\u003C\/p\u003E\u003Cp\u003EFor now, I\u2019ll leave you with the prompt I used in my AI Automator to generate the image:\u003C\/p\u003E\u003Cblockquote\u003E\u003Cp\u003EYou are an illustrating robot, and you need to illustrate a scene from a Dungeons \u0026amp; Dragons adventure.\u003C\/p\u003E\u003Cp\u003ESetting: [node:field_scene], [node:field_scene:entity:description]\u003C\/p\u003E\u003Cp\u003EEnvironment: [node:field_environment]:\u003Cbr\u003E- [node:field_environment:0:entity:description]\u003Cbr\u003E- [node:field_environment:1:entity:description]\u003Cbr\u003E- [node:field_environment:2:entity:description]\u003C\/p\u003E\u003Cp\u003ECharacters: [node:field_characters]:\u0026nbsp;\u003Cbr\u003E- [node:field_characters:0:entity:description]\u003Cbr\u003E- [node:field_characters:1:entity:description]\u003Cbr\u003E- [node:field_characters:2:entity:description]\u003C\/p\u003E\u003Cp\u003EDescription: [node:field_description]\u003C\/p\u003E\u003C\/blockquote\u003E\u003Ch2\u003EBut, Does It Work?\u003C\/h2\u003E\u003Cp\u003EIn order to test this properly, I needed a query that would test the AI\u2019s knowledge, using only references to taxonomy terms. \u0026nbsp;In my weekly D\u0026amp;D adventure, I play an armored bear named Oopie. \u0026nbsp;He wields a magic flail (a type of medieval weapon). \u0026nbsp;Currently the adventure has us on a flying ship, which has taken off and is soaring through the sky, except it\u2019s also haunted (for Halloween). \u0026nbsp;I\u2019m getting sick of typing all these details into the query every time I want to draw an image for my friends, so let\u2019s see if Drupal can help:\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20251210-ioyy.png\u0022 data-entity-uuid=\u0022aea61837-35d6-4657-aa9c-c9fe9f850494\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of Drupal config\u0022 width=\u00222416\u0022 height=\u00221524\u0022\u003E\u003Cp\u003EI\u2019ve created a node with three taxonomy terms and its own \u201cdescription\u201d field, not to be confused with the taxonomy description fields. \u0026nbsp;Anyway the taxonomies capture characters, scene, and environment (eg. night time, full moon). \u0026nbsp;This is just a test, so I\u2019m going to give the AI a query, and expect it to fill in the details using the taxonomy terms.\u003C\/p\u003E\u003Cp\u003EMy query is simple: \u201cOopie balances a ball on the end of his nose.\u201d I\u2019m expecting the AI to know that Oopie is a bear, he is wearing armor, and he is standing on the deck of a haunted flying ship at night. \u0026nbsp;The first few tests were unsuccessful, with hilarious results:\u003C\/p\u003E\u003Cdrupal-media data-entity-type=\u0022media\u0022 data-entity-uuid=\u00220994f022-cd49-46e1-a476-3b2a6c08d9a6\u0022\u003E\u0026nbsp;\u003C\/drupal-media\u003E\u003Cdrupal-media data-entity-type=\u0022media\u0022 data-entity-uuid=\u0022b41dcba9-4a31-4e7e-8088-a59d8c62bbbc\u0022\u003E\u0026nbsp;\u003C\/drupal-media\u003E\u003Cp\u003E\u0026nbsp;But once I got my module working correctly, it all slid into place:\u003C\/p\u003E\u003Cdrupal-media data-entity-type=\u0022media\u0022 data-entity-uuid=\u002273a90e01-0753-4a03-92e9-74174a86ba57\u0022\u003E\u0026nbsp;\u003C\/drupal-media\u003E","format":"full_html","processed":"\u003Cp\u003EI\u2019m proud to announce my latest contribution to the Drupal AI ecosystem: the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003EAI Deep Reference\u003C\/a\u003E module. \u0026nbsp;The purpose of this module is to help populate queries, so an AI can draw an image (or even a video). \u0026nbsp;It relies entirely on the existing \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI\u003C\/a\u003E ecosystem, and acts as a \u201cglue\u201d with the token module, to provide deeper references than the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/token\u0022\u003EToken\u003C\/a\u003E module can on its own.\u003C\/p\u003E\n\u003Cp\u003EThe module itself is not complicated; it simply hooks into the existing Token architecture, and reads the \u201cdescription\u201d field from a taxonomy term. \u0026nbsp;(By default, all taxonomy terms have a description, so you would have to engage in some shenanigans for this module not to work.)\u003C\/p\u003E\n\u003Ch2\u003EWhy Build This?\u003C\/h2\u003E\n\u003Cp\u003EMy motivation was actually a weekly Dungeons \u0026amp; Dragons session. \u0026nbsp;My friend \u003Ca href=\u0022https:\/\/www.linkedin.com\/in\/james-d-bunting\/\u0022\u003EJim\u003C\/a\u003E started these sessions during the pandemic, and \u003Ca href=\u0022https:\/\/www.linkedin.com\/in\/paul-peterson-8939355\/\u0022\u003EPaul\u003C\/a\u003E has continued to carry the flame. \u0026nbsp;My job is simple: the soundtrack. \u0026nbsp;I\u2019m responsible for injecting music into our Discord channel. \u0026nbsp;But what is music\u2026 without a little visual ambiance? \u0026nbsp;Enter the AI. \u0026nbsp;I\u2019ve been using OpenAI to generate images for our D\u0026amp;D sessions since Dall-E v2 (that\u2019s ancient, by AI reckoning).\u003C\/p\u003E\n\u003Cp\u003ESo what\u2019s the problem? \u0026nbsp;After months of being in the same adventuring party, I\u2019m getting sick of writing the same query over and over. \u0026nbsp;An armored bear carrying an enchanted flail. \u0026nbsp;A male elvish archer - because the AI always defaults to female, if you don\u2019t specify. \u0026nbsp;(I\u2019ll save the editorializing for another day.)\u003C\/p\u003E\n\u003Cp\u003EThe solution, of course, is Drupal.\u003C\/p\u003E\n\u003Cp\u003EIn particular, I want an AI generator that \u201cremembers\u201d my adventuring party, the setting, and maybe some additional details. \u0026nbsp;At the end of 2025, it\u2019s amazing how far the AI ecosystem has come in Drupal. \u0026nbsp;I was able to build almost the entire stack using community-contributed modules:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EThe AI core module (of course)\u003C\/li\u003E\n\u003Cli\u003EAI Automators (comes with the AI module)\u003C\/li\u003E\n\u003Cli\u003EToken\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_provider_openai\u0022\u003EOpenAI provider\u003C\/a\u003E, because ChatGPT is my poison of choice\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_media_image\u0022\u003EAI Media Image\u003C\/a\u003E, for integration with the media module\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThe media module integration is not necessary, but I found it helpful; older implementations had a tendency to fill up my server hard drive, which is\u2026 sub-optimal.\u003C\/p\u003E\n\u003Cp\u003EMy architecture is simple: a content type, a few taxonomies, and a single AI automator. \u0026nbsp;The automator is the secret ingredient; with it, I can grab the text fields, and generate my own AI query, using the taxonomy terms as variables.\u003C\/p\u003E\n\u003Cp\u003EAs you\u2019re adding your media field, be sure to add the AI automator.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20251210-iact.png\u0022 data-entity-uuid=\u0022beeb9083-def9-491b-af77-671fd98ccfbe\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of AI Automator in use\u0022 width=\u00222244\u0022 height=\u00221770\u0022\u003E\n\u003C\/p\u003E\u003Cp\u003EThe automator query takes plain English instruction, but we will add integration with the Token module. \u0026nbsp;This lets us grab the taxonomy terms from our other fields, and inject them in our query.\u003C\/p\u003E\n\u003Cp\u003EBut here\u2019s the limitation: with the Token module, you only get the taxonomy names. \u0026nbsp;What if you want to add a description? \u0026nbsp;The token module won\u2019t inject that into your query.\u003C\/p\u003E\n\u003Cp\u003EEnter my module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003EAI Deep Reference\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EThe premise is simple: it extends the Token module, and allows the AI Automator to read the description on the taxonomy term.\u003C\/p\u003E\n\u003Cp\u003EThe implementation is simple as well; there\u2019s an implementation of hook_token() which checks for taxonomy terms, and then injects the value of the description field. \u0026nbsp;You can see the whole thing here: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_dr\u0022\u003Ehttps:\/\/www.drupal.org\/project\/ai_dr\u003C\/a\u003E\u003C\/p\u003E\n\u003Ch2\u003EWhat\u2019s Next?\u003C\/h2\u003E\n\u003Cp\u003EHow about a recipe? \u0026nbsp;I just described my fancy DnD illustrator; maybe others would want to use it too? \u0026nbsp;Should I open my own illustrator to the public? \u0026nbsp;It would have to be ad supported, as those api bills do add up. \u0026nbsp;What about extending the module further, to work with any field attached to a taxonomy term? \u0026nbsp;Or other entity types?\u003C\/p\u003E\n\u003Cp\u003EI don\u2019t allow comments on my new blog (too many spammers), but if you\u2019ve read this far, let me know what you think! \u0026nbsp;LinkedIn is always a good choice (I\u2019ll post this blog on my wall).\u003C\/p\u003E\n\u003Cp\u003EAs always, it feels good to release a module. \u0026nbsp;Giving back to the community makes my open-source heart go pitter-pat. \u0026nbsp;(No, really; it\u2019s called the \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Human_Genome_Project\u0022\u003EHuman Genome Project\u003C\/a\u003E.)\u003C\/p\u003E\n\u003Cp\u003EFor now, I\u2019ll leave you with the prompt I used in my AI Automator to generate the image:\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cp\u003EYou are an illustrating robot, and you need to illustrate a scene from a Dungeons \u0026amp; Dragons adventure.\u003C\/p\u003E\n\u003Cp\u003ESetting: [node:field_scene], [node:field_scene:entity:description]\u003C\/p\u003E\n\u003Cp\u003EEnvironment: [node:field_environment]:\u003Cbr\u003E- [node:field_environment:0:entity:description]\u003Cbr\u003E- [node:field_environment:1:entity:description]\u003Cbr\u003E- [node:field_environment:2:entity:description]\u003C\/p\u003E\n\u003Cp\u003ECharacters: [node:field_characters]:\u0026nbsp;\u003Cbr\u003E- [node:field_characters:0:entity:description]\u003Cbr\u003E- [node:field_characters:1:entity:description]\u003Cbr\u003E- [node:field_characters:2:entity:description]\u003C\/p\u003E\n\u003Cp\u003EDescription: [node:field_description]\u003C\/p\u003E\n\u003C\/blockquote\u003E\n\u003Ch2\u003EBut, Does It Work?\u003C\/h2\u003E\n\u003Cp\u003EIn order to test this properly, I needed a query that would test the AI\u2019s knowledge, using only references to taxonomy terms. \u0026nbsp;In my weekly D\u0026amp;D adventure, I play an armored bear named Oopie. \u0026nbsp;He wields a magic flail (a type of medieval weapon). \u0026nbsp;Currently the adventure has us on a flying ship, which has taken off and is soaring through the sky, except it\u2019s also haunted (for Halloween). \u0026nbsp;I\u2019m getting sick of typing all these details into the query every time I want to draw an image for my friends, so let\u2019s see if Drupal can help:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/SCR-20251210-ioyy.png\u0022 data-entity-uuid=\u0022aea61837-35d6-4657-aa9c-c9fe9f850494\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot of Drupal config\u0022 width=\u00222416\u0022 height=\u00221524\u0022\u003E\n\u003C\/p\u003E\u003Cp\u003EI\u2019ve created a node with three taxonomy terms and its own \u201cdescription\u201d field, not to be confused with the taxonomy description fields. \u0026nbsp;Anyway the taxonomies capture characters, scene, and environment (eg. night time, full moon). \u0026nbsp;This is just a test, so I\u2019m going to give the AI a query, and expect it to fill in the details using the taxonomy terms.\u003C\/p\u003E\n\u003Cp\u003EMy query is simple: \u201cOopie balances a ball on the end of his nose.\u201d I\u2019m expecting the AI to know that Oopie is a bear, he is wearing armor, and he is standing on the deck of a haunted flying ship at night. \u0026nbsp;The first few tests were unsuccessful, with hilarious results:\u003C\/p\u003E\n\u003Cdiv class=\u0022media media--type-image media--view-mode-default\u0022\u003E\n  \n      \n  \u003Cdiv class=\u0022field field--name-field-media-image field--type-image field--label-visually_hidden\u0022\u003E\n    \u003Cdiv class=\u0022field__label visually-hidden\u0022\u003EImage\u003C\/div\u003E\n              \u003Cdiv class=\u0022field__item\u0022\u003E  \u003Cimg loading=\u0022lazy\u0022 src=\u0022\/sites\/default\/files\/styles\/large\/public\/2025-11\/ai_generated_1.jpg?itok=6sAbCf7T\u0022 width=\u0022480\u0022 height=\u0022480\u0022 alt\u003E\n\n\n\u003C\/div\u003E\n          \u003C\/div\u003E\n\n  \u003C\/div\u003E\n\u003Cdiv class=\u0022media media--type-image media--view-mode-default\u0022\u003E\n  \n      \n  \u003Cdiv class=\u0022field field--name-field-media-image field--type-image field--label-visually_hidden\u0022\u003E\n    \u003Cdiv class=\u0022field__label visually-hidden\u0022\u003EImage\u003C\/div\u003E\n              \u003Cdiv class=\u0022field__item\u0022\u003E  \u003Cimg loading=\u0022lazy\u0022 src=\u0022\/sites\/default\/files\/styles\/large\/public\/2025-11\/ai_generated_2.jpg?itok=4QpRptQ-\u0022 width=\u0022480\u0022 height=\u0022480\u0022 alt\u003E\n\n\n\u003C\/div\u003E\n          \u003C\/div\u003E\n\n  \u003C\/div\u003E\n\u003Cp\u003E\u0026nbsp;But once I got my module working correctly, it all slid into place:\u003C\/p\u003E\n\u003Cdiv class=\u0022media media--type-image media--view-mode-default\u0022\u003E\n  \n      \n  \u003Cdiv class=\u0022field field--name-field-media-image field--type-image field--label-visually_hidden\u0022\u003E\n    \u003Cdiv class=\u0022field__label visually-hidden\u0022\u003EImage\u003C\/div\u003E\n              \u003Cdiv class=\u0022field__item\u0022\u003E  \u003Cimg loading=\u0022lazy\u0022 src=\u0022\/sites\/default\/files\/styles\/large\/public\/2025-12\/ai_generated_2.jpg?itok=Z7VoTq1v\u0022 width=\u0022480\u0022 height=\u0022480\u0022 alt\u003E\n\n\n\u003C\/div\u003E\n          \u003C\/div\u003E\n\n  \u003C\/div\u003E\n","summary":"I\u2019m proud to announce my latest contribution to the Drupal AI ecosystem: the AI Deep Reference module."}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1765383811,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":333,"alt":"illustration: a robot reading a book","title":"","width":440,"height":440,"target_type":"file","target_uuid":"ca93070a-ca2f-4aab-a5ba-c95c4de792e2","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/generated_image_1765135072_6935d2e057a85.png"}],"field_tags":[]},{"nid":[{"value":84}],"uuid":[{"value":"120f59da-eb8e-4b1b-ae5b-afc1663cac88"}],"vid":[{"value":416}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-06-03T17:49:53+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Job Hunt Advice from a Veteran"}],"created":[{"value":"2025-06-03T16:48:36+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-06-03T17:49:53+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/job-hunt-advice-veteran","pid":118,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EA friend recently called me up to ask for job hunting advice. \u0026nbsp;My current job hunt extends over a year, since I was laid off from Unity (last spring). \u0026nbsp;But beyond that, I\u0027ve now seen \u003Cem\u003Ethree\u003C\/em\u003E major downturns in tech, this only being the latest. \u0026nbsp;I\u0027m a veteran, and I have some advice to share.\u003C\/p\u003E\u003Ch2\u003ELinkedIn\u003C\/h2\u003E\u003Cp\u003EYour single best tool today is LinkedIn. \u0026nbsp;There have been complaints about abuse on the system, and they are well founded - but, it\u0027s still your best bet to get a job. \u0026nbsp;In two ways:\u003C\/p\u003E\u003Ch3\u003EGet LinkedIn Premium\u003C\/h3\u003E\u003Cp\u003EIt\u0027s expensive, but worth it, if you are job hunting. \u0026nbsp;Premium gives you extra \u0022intel\u0022 on each job posting, including:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EHow many other people have applied? \u0026nbsp;If it\u0027s over 100, you should probably not waste your time. \u0026nbsp;It\u0027s impossible to stand out in that kind of crowd.\u003C\/li\u003E\u003Cli\u003EHow many other applicants were senior level? \u0026nbsp;Junior level? \u0026nbsp;Includes AI analysis on how you compare to them.\u003C\/li\u003E\u003Cli\u003EOther valuable features regarding your visibility online, especially for recruiters. \u0026nbsp;Eg. you can add a badge to your profile picture that says you\u0027re \u0022open\u0022 for new opportunities.\u003C\/li\u003E\u003C\/ul\u003E\u003Ch3\u003EGet Active\u003C\/h3\u003E\u003Cp\u003EOne recruiter gave me the following piece of advice: post frequently on LinkedIn, at least once per week. \u0026nbsp;This \u0022juices\u0022 the algorithm that LinkedIn uses. \u0026nbsp;This way, when a recruiter searches for talent, your name will float to the top.\u003C\/p\u003E\u003Cp\u003EHere\u0027s what works for me: a combination of written blog posts (like this one), and video presentations on youtube. \u0026nbsp;In both cases, I simply talk about subjects that interest me, and are related to my profession:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EHow to use Drupal\u003C\/li\u003E\u003Cli\u003EHow to make a headless AI chatbot\u003C\/li\u003E\u003Cli\u003EHow to job hunt\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EOnce I\u0027ve posted my content, I post a link on LinkedIn. \u0026nbsp;It\u0027s as easy as that. \u0026nbsp;(OK, creating new content on a weekly basis isn\u0027t easy. \u0026nbsp;It takes effort. \u0026nbsp;But you can do it while sitting down.)\u003C\/p\u003E\u003Ch3\u003EUse Agents\u003C\/h3\u003E\u003Cp\u003EYou can set up a \u0022robot\u0022 on LinkedIn, Dice, and other job boards, to scan the job posts and send you an email once a day. \u0026nbsp;Do this, and apply to all the jobs you think are a good fit (see above for tips on using Premium to filter the list).\u003C\/p\u003E\u003Cp\u003EI know a lot of people use AI to write cover letters. \u0026nbsp;There are tools where you input your resume, and the job description, and ask the AI to write a professional letter that highlights your accomplishments, and how you\u0027re a great fit for this opportunity. \u0026nbsp;I usually don\u0027t bother with cover letters; YMMV.\u003C\/p\u003E\u003Ch2\u003EMeetups \u0026amp; Conferences\u003C\/h2\u003E\u003Cp\u003EI got my start by attending local meetups for Drupal users. \u0026nbsp;Long story short: personal connections matter, both over the short term, and the long term. \u0026nbsp;It was a different time, but I got picked up by employers incredibly quickly, just by showing up in person. \u0026nbsp;Meetup.com is a great place to start. \u0026nbsp;So are local conferences. \u0026nbsp;If you live in the San Francisco Bay Area, there are local conferences all the time. \u0026nbsp;You can often get a free expo pass, which gives you an opportunity to talk to every company present - and ask if they\u0027re hiring.\u003C\/p\u003E\u003Ch2\u003EUpdate Your Resume\u003C\/h2\u003E\u003Cp\u003EI had a beautiful old resume with a manicule on it. \u0026nbsp;The problem: that\u0027s not how the game is played any more. \u0026nbsp;Now, the recruiter takes your resume, feeds it through an AI, and gets a number that represents your compatibility to the job. \u0026nbsp;Your first step: rewrite your resume so it can be \u003Cem\u003Ecrawled\u003C\/em\u003E by the AI. \u0026nbsp;There\u0027s a good template here: \u003Ca href=\u0022https:\/\/careers.byu.edu\/students\/hiring-resources\/resumes\/resume-templates\u0022\u003Ehttps:\/\/careers.byu.edu\/students\/hiring-resources\/resumes\/resume-templates\u003C\/a\u003E\u003C\/p\u003E\u003Cp\u003EIn addition, you\u0027ll want to edit your resume to make it fit each job you apply to. \u0026nbsp;Sometimes recruiters will offer guidance; you should always take it. \u0026nbsp;You\u0027ll end up with a dozen different versions of the same resume.\u003C\/p\u003E\u003Cp\u003EUpload your resume to LinkedIn, Dice, and anywhere else you apply. \u0026nbsp;It helps juice the algorithm, and on some hiring platforms, the recruiter can get access to your latest resume. \u0026nbsp;That gives you an advantage.\u003C\/p\u003E\u003Ch2\u003EWhat Else?\u003C\/h2\u003E\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E get a professional-looking headshot; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E use a cute avatar.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E learn how to get the LinkedIn QR code; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E bother with business cards (no one has them any more).\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E apply to at least one job per day; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E burn yourself out. \u0026nbsp;This is probably going to be a marathon, not a sprint.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E take advantage of the opportunity to do other things: side projects, hobbies, family.\u003C\/p\u003E\u003Cp\u003EThis is the worst tech job market I\u0027ve seen in 20 years. \u0026nbsp;\u003Cstrong\u003EDon\u0027t\u003C\/strong\u003E let that get you down. \u0026nbsp;Ignore the statistics. \u0026nbsp;You don\u0027t need 40,000 new jobs per month; you only need one.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EA friend recently called me up to ask for job hunting advice. \u0026nbsp;My current job hunt extends over a year, since I was laid off from Unity (last spring). \u0026nbsp;But beyond that, I\u0027ve now seen \u003Cem\u003Ethree\u003C\/em\u003E major downturns in tech, this only being the latest. \u0026nbsp;I\u0027m a veteran, and I have some advice to share.\u003C\/p\u003E\n\u003Ch2\u003ELinkedIn\u003C\/h2\u003E\n\u003Cp\u003EYour single best tool today is LinkedIn. \u0026nbsp;There have been complaints about abuse on the system, and they are well founded - but, it\u0027s still your best bet to get a job. \u0026nbsp;In two ways:\u003C\/p\u003E\n\u003Ch3\u003EGet LinkedIn Premium\u003C\/h3\u003E\n\u003Cp\u003EIt\u0027s expensive, but worth it, if you are job hunting. \u0026nbsp;Premium gives you extra \u0022intel\u0022 on each job posting, including:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EHow many other people have applied? \u0026nbsp;If it\u0027s over 100, you should probably not waste your time. \u0026nbsp;It\u0027s impossible to stand out in that kind of crowd.\u003C\/li\u003E\n\u003Cli\u003EHow many other applicants were senior level? \u0026nbsp;Junior level? \u0026nbsp;Includes AI analysis on how you compare to them.\u003C\/li\u003E\n\u003Cli\u003EOther valuable features regarding your visibility online, especially for recruiters. \u0026nbsp;Eg. you can add a badge to your profile picture that says you\u0027re \u0022open\u0022 for new opportunities.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EGet Active\u003C\/h3\u003E\n\u003Cp\u003EOne recruiter gave me the following piece of advice: post frequently on LinkedIn, at least once per week. \u0026nbsp;This \u0022juices\u0022 the algorithm that LinkedIn uses. \u0026nbsp;This way, when a recruiter searches for talent, your name will float to the top.\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s what works for me: a combination of written blog posts (like this one), and video presentations on youtube. \u0026nbsp;In both cases, I simply talk about subjects that interest me, and are related to my profession:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EHow to use Drupal\u003C\/li\u003E\n\u003Cli\u003EHow to make a headless AI chatbot\u003C\/li\u003E\n\u003Cli\u003EHow to job hunt\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EOnce I\u0027ve posted my content, I post a link on LinkedIn. \u0026nbsp;It\u0027s as easy as that. \u0026nbsp;(OK, creating new content on a weekly basis isn\u0027t easy. \u0026nbsp;It takes effort. \u0026nbsp;But you can do it while sitting down.)\u003C\/p\u003E\n\u003Ch3\u003EUse Agents\u003C\/h3\u003E\n\u003Cp\u003EYou can set up a \u0022robot\u0022 on LinkedIn, Dice, and other job boards, to scan the job posts and send you an email once a day. \u0026nbsp;Do this, and apply to all the jobs you think are a good fit (see above for tips on using Premium to filter the list).\u003C\/p\u003E\n\u003Cp\u003EI know a lot of people use AI to write cover letters. \u0026nbsp;There are tools where you input your resume, and the job description, and ask the AI to write a professional letter that highlights your accomplishments, and how you\u0027re a great fit for this opportunity. \u0026nbsp;I usually don\u0027t bother with cover letters; YMMV.\u003C\/p\u003E\n\u003Ch2\u003EMeetups \u0026amp; Conferences\u003C\/h2\u003E\n\u003Cp\u003EI got my start by attending local meetups for Drupal users. \u0026nbsp;Long story short: personal connections matter, both over the short term, and the long term. \u0026nbsp;It was a different time, but I got picked up by employers incredibly quickly, just by showing up in person. \u0026nbsp;Meetup.com is a great place to start. \u0026nbsp;So are local conferences. \u0026nbsp;If you live in the San Francisco Bay Area, there are local conferences all the time. \u0026nbsp;You can often get a free expo pass, which gives you an opportunity to talk to every company present - and ask if they\u0027re hiring.\u003C\/p\u003E\n\u003Ch2\u003EUpdate Your Resume\u003C\/h2\u003E\n\u003Cp\u003EI had a beautiful old resume with a manicule on it. \u0026nbsp;The problem: that\u0027s not how the game is played any more. \u0026nbsp;Now, the recruiter takes your resume, feeds it through an AI, and gets a number that represents your compatibility to the job. \u0026nbsp;Your first step: rewrite your resume so it can be \u003Cem\u003Ecrawled\u003C\/em\u003E by the AI. \u0026nbsp;There\u0027s a good template here: \u003Ca href=\u0022https:\/\/careers.byu.edu\/students\/hiring-resources\/resumes\/resume-templates\u0022\u003Ehttps:\/\/careers.byu.edu\/students\/hiring-resources\/resumes\/resume-templates\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EIn addition, you\u0027ll want to edit your resume to make it fit each job you apply to. \u0026nbsp;Sometimes recruiters will offer guidance; you should always take it. \u0026nbsp;You\u0027ll end up with a dozen different versions of the same resume.\u003C\/p\u003E\n\u003Cp\u003EUpload your resume to LinkedIn, Dice, and anywhere else you apply. \u0026nbsp;It helps juice the algorithm, and on some hiring platforms, the recruiter can get access to your latest resume. \u0026nbsp;That gives you an advantage.\u003C\/p\u003E\n\u003Ch2\u003EWhat Else?\u003C\/h2\u003E\n\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E get a professional-looking headshot; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E use a cute avatar.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E learn how to get the LinkedIn QR code; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E bother with business cards (no one has them any more).\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E apply to at least one job per day; \u003Cstrong\u003Edon\u0027t\u003C\/strong\u003E burn yourself out. \u0026nbsp;This is probably going to be a marathon, not a sprint.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EDo\u003C\/strong\u003E take advantage of the opportunity to do other things: side projects, hobbies, family.\u003C\/p\u003E\n\u003Cp\u003EThis is the worst tech job market I\u0027ve seen in 20 years. \u0026nbsp;\u003Cstrong\u003EDon\u0027t\u003C\/strong\u003E let that get you down. \u0026nbsp;Ignore the statistics. \u0026nbsp;You don\u0027t need 40,000 new jobs per month; you only need one.\u003C\/p\u003E\n","summary":"Tales from the trenches"}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1748972993,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":43,"alt":"a programmer in the trenches, during WWI","title":"","width":640,"height":640,"target_type":"file","target_uuid":"50a67de6-7c7f-44ef-8804-1be1cc9a1d34","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/trenches.jpeg"}],"field_tags":[]},{"nid":[{"value":83}],"uuid":[{"value":"f812a263-bb8d-4dc2-9b50-4798fa347071"}],"vid":[{"value":412}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-05-30T03:51:20+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"My Tech Stack, 2025 Edition"}],"created":[{"value":"2025-05-30T02:53:45+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-05-30T03:51:20+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/my-tech-stack-2025-edition","pid":117,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EIt\u0027s been a few years since I shared my toolset. \u0026nbsp;The right tool makes the work a lot easier - a piece of wisdom I picked up from woodworking.\u003C\/p\u003E\u003Cp\u003EOK, enough dad wisdom.\u003C\/p\u003E\u003Ch2\u003EHardware\u003C\/h2\u003E\u003Cp\u003ELet\u0027s start with the boring stuff. \u0026nbsp;I\u0027ve been using \u003Cstrong\u003EMac\u003C\/strong\u003E for a long time. \u0026nbsp;Last time I checked JD Power \u0026amp; Assoc., Apple still produced the best computer hardware. \u0026nbsp;It\u0027s easy to see the difference; I don\u0027t know any PC companies that make metal cases. \u0026nbsp;(Metal cases alone don\u0027t make a Mac better, but it\u0027s emblematic of a deeper focus on durability.) It\u0027s typical for my Macs to last 6-10 years; I\u0027ve never seen a PC last that long.\u003C\/p\u003E\u003Cp\u003E(One exception: the \u003Cstrong\u003EAirPod Max\u003C\/strong\u003E. \u0026nbsp;It\u0027s a \u003Cem\u003Egorgeous\u003C\/em\u003E headset, but it has a critical design flaw: the only way to turn it off is by folding the ear cups sideways. \u0026nbsp;Why is that bad? \u0026nbsp;Because it has a tiny, fragile wire inside, which twists back \u0026amp; forth. \u0026nbsp;Eventually that wire breaks, and your headphones are crippled. \u0026nbsp;That\u0027s a design flaw, and the result is a very expensive headset that only lasts a couple years. \u0026nbsp;I expect better from Apple. \u0026nbsp;The solution: an inexpensive \u0026nbsp;\u003Ca href=\u0022https:\/\/a.co\/d\/jc2tf3v\u0022\u003E3rd party charger\u003C\/a\u003E, which charges the headset with ear cups in the \u0022open\u0022 position.)\u003C\/p\u003E\u003Cp\u003EMore Apple magic comes in the form of the \u003Cstrong\u003EMagic Mouse II\u003C\/strong\u003E. \u0026nbsp;It\u0027s another older device that just keeps on ticking. \u0026nbsp;What I love: the entire top surface is a touchpad, so you can use swipe gestures. \u0026nbsp;I love switching between desktops, using just a swipe of my fingers. \u0026nbsp;Right-click, multi-touch, and scroll are all supported. \u0026nbsp;(It\u0027s worth noting this is a lousy setup for gaming; but this is a business blog!)\u003C\/p\u003E\u003Cp\u003EI rely heavily on my \u003Cstrong\u003EKeychron V6\u003C\/strong\u003E mechanical keyboard. \u0026nbsp;Because I\u0027m a programmer, so \u003Cem\u003Eof course\u003C\/em\u003E I have a loud mechanical keyboard with \u0022clacky\u0022 keys. \u0026nbsp;This one\u0027s actually an improvement - I got the Cherry MX Brown switches, which are known to be quieter, but still give a satisfying \u003Cem\u003Eclack. \u003C\/em\u003EBefore this, I had a Das Keyboard, which I also loved - but they discontinued support for the keyboard app. \u0026nbsp;(With a backlit keyboard, you use the app to set color scheme and related features.) Keychron took a different strategy: they don\u0027t support software directly, but they do support the \u003Ca href=\u0022https:\/\/usevia.app\/\u0022\u003EVia\u003C\/a\u003E protocol. \u0026nbsp;You can control the keyboard using a 3rd party website, which can communicate directly with your keyboard to change the color scheme. \u0026nbsp;It\u0027s much simpler, but more likely to be supported in the future. \u0026nbsp;I don\u0027t consider keyboards to be consumable products; I expect them to last, and their software should too.\u003C\/p\u003E\u003Cp\u003EMy poison of choice is a laptop, so of course I need a dock. \u0026nbsp;I opted for a \u003Cstrong\u003ESelore dock\u003C\/strong\u003E, because it supports all the ports I need: an external monitor (or two), ethernet, power, and a selection of usb-a \u0026amp; usb-c. \u0026nbsp;I picked an older model that also holds my \u003Cstrong\u003ESteam Deck\u003C\/strong\u003E... but that\u0027s also not for business.\u003C\/p\u003E\u003Ch2\u003ESoftware\u003C\/h2\u003E\u003Cp\u003EI\u0027ve been relying heavily on Google for years, so it\u0027s little surprise that I still use \u003Cstrong\u003EChrome\u003C\/strong\u003E as my primary browser. \u0026nbsp;It integrates beautifully with the different Google services (Gmail, calendar, bookmarks, passwords). \u0026nbsp;It\u0027s still among the safest and most private browsers on the market, and still one of the most popular. \u0026nbsp;Because of this, it\u0027s the \u0022gold standard\u0022 for web development. \u0026nbsp;Given that, \u003Cem\u003Eof course\u003C\/em\u003E it\u0027s the one I use most often. \u0026nbsp;(For the record, I have \u003Cem\u003Eevery\u003C\/em\u003E browser installed on my computer. \u0026nbsp;Because my job demands it.)\u003C\/p\u003E\u003Cp\u003EInstant messaging used to be easy. \u0026nbsp;First there were only a couple platforms, then there were 3rd-party apps like Pidgin that could integrate all the different chat apps into one. \u0026nbsp;Those were simpler times.\u003C\/p\u003E\u003Cp\u003EIn our savage present, the solution is to install \u003Cem\u003Eall\u003C\/em\u003E the apps. \u0026nbsp;So I typically use Whatsapp, but also Discord, Slack, and Signal. \u0026nbsp;My preference is whichever one \u003Cem\u003Eyou\u003C\/em\u003E use. \u0026nbsp;I\u0027ve given up trying to evangelize.\u003C\/p\u003E\u003Cp\u003EFor work, my main tool is \u003Cstrong\u003EPHPStorm. \u003C\/strong\u003EIt\u0027s a paid app, decidedly \u003Cem\u003Enot\u003C\/em\u003E FOSS, and yet it\u0027s the best tool on the market (IMHO). \u0026nbsp;It\u0027s an IDE (Integrated Development Environment), which means it crams all the tools you\u0027ll need into one app. \u0026nbsp;Terminal, code editor, file browser, AI, it does it all. \u0026nbsp;Even better, it recognizes when you\u0027re using a common app framework (like Drupal), and adapts its config accordingly. \u0026nbsp;\u003Cem\u003EOf course\u003C\/em\u003E it scans your entire codebase and does syntax highlighting and autocomplete. \u0026nbsp;I\u0027ve been a fan for years, and I keep coming back.\u003C\/p\u003E\u003Cp\u003EPHPStorm also integrates with \u003Cstrong\u003EWindsurf,\u003C\/strong\u003E which is the new hotness. \u0026nbsp;Windsurf is an agentic AI, meaning you can give it instructions, and it will \u003Cem\u003Ewrite code for you. \u003C\/em\u003ENot in a separate window, where you have to copy \u0026amp; paste; it delivers new code directly into your files. \u0026nbsp;It\u0027s a scary idea, but Windsurf makes it a lot safer: you need to approve Windsurf\u0027s code both \u003Cem\u003Ebefore \u003C\/em\u003Eand \u003Cem\u003Eafter\u003C\/em\u003E it generates. \u0026nbsp;First, Windsurf asks for permission. \u0026nbsp;And after, you still need to approve the git commit. \u0026nbsp;This takes the fangs out of agentic AI, and leaves a human in control. \u0026nbsp;In my mind, it\u0027s the perfect balance. \u0026nbsp;Even better: Windsurf has a plugin for PHPStorm, so I don\u0027t have to give up my favorite IDE in order to enjoy the new hotness. \u0026nbsp;It\u0027s only been a few weeks, but Windsurf is already a beloved addition to my toolset.\u003C\/p\u003E\u003Cp\u003EAmong old tools making a comback: \u003Cstrong\u003EDDEV\u003C\/strong\u003E, a tool for local web development. \u0026nbsp;It shortcuts the development process by simulating a web server directly on your laptop, so you can test locally, without having to upload first. \u0026nbsp;It integrates very well with Drupal, and supports a \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/content\/i-added-chatbot\u0022\u003Eheadless stack\u003C\/a\u003E as well.\u003C\/p\u003E\u003Ch2\u003EBonus Points\u003C\/h2\u003E\u003Cp\u003EIt\u0027s 2025, where\u0027s the AI??? \u0026nbsp;Well - I already said I use Windsurf for work. \u0026nbsp;For other purposes, I use \u003Cstrong\u003EOpenAI\u003C\/strong\u003E. \u0026nbsp;They recently released a new LLM for generating images, and I like playing with that. \u0026nbsp;The cheapest way to get there is to sign up for a developer account, give them your credit card number, and get an api key. \u0026nbsp;Using an api key, you can set up your own image generator. \u0026nbsp;Of course \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/openai_client\/\u0022\u003Ethere\u0027s a module for that\u003C\/a\u003E (and I\u0027m a co-maintainer). \u0026nbsp;Of course I\u0027ve also tested out Claude, Gemini, Llama, and others - but OpenAI seems to have the best balance of speed, power, and features that I\u0027m looking for. \u0026nbsp;AI is a fast-changing industry and I fully expect my words to be out of date by the end of the year.\u003C\/p\u003E\u003Cp\u003EOne exception: I use \u003Cstrong\u003EAmazon Q\u003C\/strong\u003E for one purpose: terminal auto-complete. \u0026nbsp;It\u0027s auto-complete, for your command line! \u0026nbsp;It\u0027s one of those features that, once I saw it, I couldn\u0027t live without it again. \u0026nbsp;Technically it\u0027s an AI product from Amazon Web Services, but all I use it for is terminal auto-complete. \u0026nbsp;(Yes, it plays nicely with PHPStorm.)\u003C\/p\u003E\u003Cp\u003EI recently released a couple Youtube videos on my \u003Ca href=\u0022https:\/\/www.youtube.com\/playlist?list=PLbHy5jZpoVCnftFzoHyOEXWVZ4ey6pAxI\u0022\u003Enew channel\u003C\/a\u003E, and I found one piece of software to be indispensable: it\u0027s called \u003Cstrong\u003EScreen Studio.\u003C\/strong\u003E \u0026nbsp;It captures your screen and your webcam simultaneously, to create that lovely picture-in-picture effect that all the Youtubers are using these days. \u0026nbsp;It has other nice \u0022quality of life\u0022 features as well, to make my amateur videos seem pretty polished. \u0026nbsp;At the time of this writing, it is only available for Mac. \u0026nbsp;\u003Cstrong\u003EShottr\u003C\/strong\u003E is similarly great, for screenshots. \u0026nbsp;More honorable mentions:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EStat\u003C\/strong\u003E: a free stats bar that runs in your menu bar. \u0026nbsp;CPU, disk \u0026amp; network usage, \u0026amp;c. \u0026nbsp;As a power user who sometimes abuses his hardware, I find a tool like this to be critical.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003E1Clipboard:\u003C\/strong\u003E also free, it keeps track when you copy multiple things at once. \u0026nbsp;It can handle text and images, and it also great if you accidentally cut some important text and then forget about it.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EMeetingBar:\u003C\/strong\u003E Ever forget a meeting? \u0026nbsp;This handy little tool leaves a reminder in your menu bar, where you\u0027re more likely to notice it. \u0026nbsp;It integrates with your calendar (including Google Calendar), and a handy drop-down menu provides links directly to your zoom meetings. \u0026nbsp;(Other videoconferencing is supported too.)\u003C\/li\u003E\u003C\/ul\u003E","format":"full_html","processed":"\u003Cp\u003EIt\u0027s been a few years since I shared my toolset. \u0026nbsp;The right tool makes the work a lot easier - a piece of wisdom I picked up from woodworking.\u003C\/p\u003E\n\u003Cp\u003EOK, enough dad wisdom.\u003C\/p\u003E\n\u003Ch2\u003EHardware\u003C\/h2\u003E\n\u003Cp\u003ELet\u0027s start with the boring stuff. \u0026nbsp;I\u0027ve been using \u003Cstrong\u003EMac\u003C\/strong\u003E for a long time. \u0026nbsp;Last time I checked JD Power \u0026amp; Assoc., Apple still produced the best computer hardware. \u0026nbsp;It\u0027s easy to see the difference; I don\u0027t know any PC companies that make metal cases. \u0026nbsp;(Metal cases alone don\u0027t make a Mac better, but it\u0027s emblematic of a deeper focus on durability.) It\u0027s typical for my Macs to last 6-10 years; I\u0027ve never seen a PC last that long.\u003C\/p\u003E\n\u003Cp\u003E(One exception: the \u003Cstrong\u003EAirPod Max\u003C\/strong\u003E. \u0026nbsp;It\u0027s a \u003Cem\u003Egorgeous\u003C\/em\u003E headset, but it has a critical design flaw: the only way to turn it off is by folding the ear cups sideways. \u0026nbsp;Why is that bad? \u0026nbsp;Because it has a tiny, fragile wire inside, which twists back \u0026amp; forth. \u0026nbsp;Eventually that wire breaks, and your headphones are crippled. \u0026nbsp;That\u0027s a design flaw, and the result is a very expensive headset that only lasts a couple years. \u0026nbsp;I expect better from Apple. \u0026nbsp;The solution: an inexpensive \u0026nbsp;\u003Ca href=\u0022https:\/\/a.co\/d\/jc2tf3v\u0022\u003E3rd party charger\u003C\/a\u003E, which charges the headset with ear cups in the \u0022open\u0022 position.)\u003C\/p\u003E\n\u003Cp\u003EMore Apple magic comes in the form of the \u003Cstrong\u003EMagic Mouse II\u003C\/strong\u003E. \u0026nbsp;It\u0027s another older device that just keeps on ticking. \u0026nbsp;What I love: the entire top surface is a touchpad, so you can use swipe gestures. \u0026nbsp;I love switching between desktops, using just a swipe of my fingers. \u0026nbsp;Right-click, multi-touch, and scroll are all supported. \u0026nbsp;(It\u0027s worth noting this is a lousy setup for gaming; but this is a business blog!)\u003C\/p\u003E\n\u003Cp\u003EI rely heavily on my \u003Cstrong\u003EKeychron V6\u003C\/strong\u003E mechanical keyboard. \u0026nbsp;Because I\u0027m a programmer, so \u003Cem\u003Eof course\u003C\/em\u003E I have a loud mechanical keyboard with \u0022clacky\u0022 keys. \u0026nbsp;This one\u0027s actually an improvement - I got the Cherry MX Brown switches, which are known to be quieter, but still give a satisfying \u003Cem\u003Eclack. \u003C\/em\u003EBefore this, I had a Das Keyboard, which I also loved - but they discontinued support for the keyboard app. \u0026nbsp;(With a backlit keyboard, you use the app to set color scheme and related features.) Keychron took a different strategy: they don\u0027t support software directly, but they do support the \u003Ca href=\u0022https:\/\/usevia.app\/\u0022\u003EVia\u003C\/a\u003E protocol. \u0026nbsp;You can control the keyboard using a 3rd party website, which can communicate directly with your keyboard to change the color scheme. \u0026nbsp;It\u0027s much simpler, but more likely to be supported in the future. \u0026nbsp;I don\u0027t consider keyboards to be consumable products; I expect them to last, and their software should too.\u003C\/p\u003E\n\u003Cp\u003EMy poison of choice is a laptop, so of course I need a dock. \u0026nbsp;I opted for a \u003Cstrong\u003ESelore dock\u003C\/strong\u003E, because it supports all the ports I need: an external monitor (or two), ethernet, power, and a selection of usb-a \u0026amp; usb-c. \u0026nbsp;I picked an older model that also holds my \u003Cstrong\u003ESteam Deck\u003C\/strong\u003E... but that\u0027s also not for business.\u003C\/p\u003E\n\u003Ch2\u003ESoftware\u003C\/h2\u003E\n\u003Cp\u003EI\u0027ve been relying heavily on Google for years, so it\u0027s little surprise that I still use \u003Cstrong\u003EChrome\u003C\/strong\u003E as my primary browser. \u0026nbsp;It integrates beautifully with the different Google services (Gmail, calendar, bookmarks, passwords). \u0026nbsp;It\u0027s still among the safest and most private browsers on the market, and still one of the most popular. \u0026nbsp;Because of this, it\u0027s the \u0022gold standard\u0022 for web development. \u0026nbsp;Given that, \u003Cem\u003Eof course\u003C\/em\u003E it\u0027s the one I use most often. \u0026nbsp;(For the record, I have \u003Cem\u003Eevery\u003C\/em\u003E browser installed on my computer. \u0026nbsp;Because my job demands it.)\u003C\/p\u003E\n\u003Cp\u003EInstant messaging used to be easy. \u0026nbsp;First there were only a couple platforms, then there were 3rd-party apps like Pidgin that could integrate all the different chat apps into one. \u0026nbsp;Those were simpler times.\u003C\/p\u003E\n\u003Cp\u003EIn our savage present, the solution is to install \u003Cem\u003Eall\u003C\/em\u003E the apps. \u0026nbsp;So I typically use Whatsapp, but also Discord, Slack, and Signal. \u0026nbsp;My preference is whichever one \u003Cem\u003Eyou\u003C\/em\u003E use. \u0026nbsp;I\u0027ve given up trying to evangelize.\u003C\/p\u003E\n\u003Cp\u003EFor work, my main tool is \u003Cstrong\u003EPHPStorm. \u003C\/strong\u003EIt\u0027s a paid app, decidedly \u003Cem\u003Enot\u003C\/em\u003E FOSS, and yet it\u0027s the best tool on the market (IMHO). \u0026nbsp;It\u0027s an IDE (Integrated Development Environment), which means it crams all the tools you\u0027ll need into one app. \u0026nbsp;Terminal, code editor, file browser, AI, it does it all. \u0026nbsp;Even better, it recognizes when you\u0027re using a common app framework (like Drupal), and adapts its config accordingly. \u0026nbsp;\u003Cem\u003EOf course\u003C\/em\u003E it scans your entire codebase and does syntax highlighting and autocomplete. \u0026nbsp;I\u0027ve been a fan for years, and I keep coming back.\u003C\/p\u003E\n\u003Cp\u003EPHPStorm also integrates with \u003Cstrong\u003EWindsurf,\u003C\/strong\u003E which is the new hotness. \u0026nbsp;Windsurf is an agentic AI, meaning you can give it instructions, and it will \u003Cem\u003Ewrite code for you. \u003C\/em\u003ENot in a separate window, where you have to copy \u0026amp; paste; it delivers new code directly into your files. \u0026nbsp;It\u0027s a scary idea, but Windsurf makes it a lot safer: you need to approve Windsurf\u0027s code both \u003Cem\u003Ebefore \u003C\/em\u003Eand \u003Cem\u003Eafter\u003C\/em\u003E it generates. \u0026nbsp;First, Windsurf asks for permission. \u0026nbsp;And after, you still need to approve the git commit. \u0026nbsp;This takes the fangs out of agentic AI, and leaves a human in control. \u0026nbsp;In my mind, it\u0027s the perfect balance. \u0026nbsp;Even better: Windsurf has a plugin for PHPStorm, so I don\u0027t have to give up my favorite IDE in order to enjoy the new hotness. \u0026nbsp;It\u0027s only been a few weeks, but Windsurf is already a beloved addition to my toolset.\u003C\/p\u003E\n\u003Cp\u003EAmong old tools making a comback: \u003Cstrong\u003EDDEV\u003C\/strong\u003E, a tool for local web development. \u0026nbsp;It shortcuts the development process by simulating a web server directly on your laptop, so you can test locally, without having to upload first. \u0026nbsp;It integrates very well with Drupal, and supports a \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/content\/i-added-chatbot\u0022\u003Eheadless stack\u003C\/a\u003E as well.\u003C\/p\u003E\n\u003Ch2\u003EBonus Points\u003C\/h2\u003E\n\u003Cp\u003EIt\u0027s 2025, where\u0027s the AI??? \u0026nbsp;Well - I already said I use Windsurf for work. \u0026nbsp;For other purposes, I use \u003Cstrong\u003EOpenAI\u003C\/strong\u003E. \u0026nbsp;They recently released a new LLM for generating images, and I like playing with that. \u0026nbsp;The cheapest way to get there is to sign up for a developer account, give them your credit card number, and get an api key. \u0026nbsp;Using an api key, you can set up your own image generator. \u0026nbsp;Of course \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/openai_client\/\u0022\u003Ethere\u0027s a module for that\u003C\/a\u003E (and I\u0027m a co-maintainer). \u0026nbsp;Of course I\u0027ve also tested out Claude, Gemini, Llama, and others - but OpenAI seems to have the best balance of speed, power, and features that I\u0027m looking for. \u0026nbsp;AI is a fast-changing industry and I fully expect my words to be out of date by the end of the year.\u003C\/p\u003E\n\u003Cp\u003EOne exception: I use \u003Cstrong\u003EAmazon Q\u003C\/strong\u003E for one purpose: terminal auto-complete. \u0026nbsp;It\u0027s auto-complete, for your command line! \u0026nbsp;It\u0027s one of those features that, once I saw it, I couldn\u0027t live without it again. \u0026nbsp;Technically it\u0027s an AI product from Amazon Web Services, but all I use it for is terminal auto-complete. \u0026nbsp;(Yes, it plays nicely with PHPStorm.)\u003C\/p\u003E\n\u003Cp\u003EI recently released a couple Youtube videos on my \u003Ca href=\u0022https:\/\/www.youtube.com\/playlist?list=PLbHy5jZpoVCnftFzoHyOEXWVZ4ey6pAxI\u0022\u003Enew channel\u003C\/a\u003E, and I found one piece of software to be indispensable: it\u0027s called \u003Cstrong\u003EScreen Studio.\u003C\/strong\u003E \u0026nbsp;It captures your screen and your webcam simultaneously, to create that lovely picture-in-picture effect that all the Youtubers are using these days. \u0026nbsp;It has other nice \u0022quality of life\u0022 features as well, to make my amateur videos seem pretty polished. \u0026nbsp;At the time of this writing, it is only available for Mac. \u0026nbsp;\u003Cstrong\u003EShottr\u003C\/strong\u003E is similarly great, for screenshots. \u0026nbsp;More honorable mentions:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EStat\u003C\/strong\u003E: a free stats bar that runs in your menu bar. \u0026nbsp;CPU, disk \u0026amp; network usage, \u0026amp;c. \u0026nbsp;As a power user who sometimes abuses his hardware, I find a tool like this to be critical.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003E1Clipboard:\u003C\/strong\u003E also free, it keeps track when you copy multiple things at once. \u0026nbsp;It can handle text and images, and it also great if you accidentally cut some important text and then forget about it.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EMeetingBar:\u003C\/strong\u003E Ever forget a meeting? \u0026nbsp;This handy little tool leaves a reminder in your menu bar, where you\u0027re more likely to notice it. \u0026nbsp;It integrates with your calendar (including Google Calendar), and a handy drop-down menu provides links directly to your zoom meetings. \u0026nbsp;(Other videoconferencing is supported too.)\u003C\/li\u003E\n\u003C\/ul\u003E\n","summary":"The right tool makes the work a lot easier."}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1748577080,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":33,"alt":"an illustration of a robot adjusting himself with a wrench","title":"","width":1024,"height":1024,"target_type":"file","target_uuid":"d211326c-e091-42df-970f-e31977eba324","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/generated_image_1748576105_683927699f03c.jpg"}],"field_tags":[]},{"nid":[{"value":82}],"uuid":[{"value":"f68693e2-4cba-4275-b750-2d67c6dec0ea"}],"vid":[{"value":417}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-09-19T19:52:19+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"AI Recipe for Drupal"}],"created":[{"value":"2025-05-19T19:38:30+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-09-19T19:52:19+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/ai-recipe-drupal","pid":116,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EAfter the success of my \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=F_qRlWffVzc\u0022\u003EStanford talk\u003C\/a\u003E, I thought I\u0027d take it to the next level. \u0026nbsp;The hot new thing in Drupal is recipes, which are part of Project Starshot. \u0026nbsp;(Short version: let\u0027s make Drupal easier to adopt.) In this case, that means a single recipe that will download and enable the modules you need to create your own AI chatbot - no code required!\u003C\/p\u003E\u003Cp\u003EThe bad news: You still need to configure the modules. \u0026nbsp;Right now, recipes are still pretty limited; there is no wizard to configure the modules for you. \u0026nbsp;(The Drupal community is already working on it, but there are bugs.) So, what does the recipe do? \u0026nbsp;It \u003Cstrong\u003Einstalls \u0026amp; enables\u003C\/strong\u003E the modules you need. \u0026nbsp;This is a process:\u003C\/p\u003E\u003Col style=\u0022-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;box-sizing:border-box;color:rgb(34, 34, 34);font-family:NotoSans, system-ui, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;list-style:outside decimal;margin:0px 0px 0.692em;orphans:2;padding:0px 0px 0px 2em;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;vertical-align:baseline;white-space:normal;widows:2;word-spacing:0px;\u0022\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003ESet \u0022minimum-stability\u0022: \u0022dev\u0022 in your composer.json\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EDownload the recipe: \u003Ca style=\u0022border-width:0px;box-sizing:border-box;color:rgb(0, 106, 169);font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;text-decoration:none;vertical-align:baseline;\u0022 href=\u0022https:\/\/www.drupal.org\/project\/ai_chatbot_recipe\u0022 rel=\u0022nofollow\u0022\u003Ehttps:\/\/www.drupal.org\/project\/ai_chatbot_recipe\u003C\/a\u003E\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EStore in your `..\/recipes` folder\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EClear the cache: `drush cr`\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EEnable the recipe: `drush recipe ..\/recipes\/ai-chatbot-recipe`\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EConfigure the modules (each chatbot is unique)\u003C\/li\u003E\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EGet API keys from OpenAI and Pinecone\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EFor next steps, check out \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/content\/building-rag-drupal-easy-way\u0022\u003Emy previous post\u003C\/a\u003E, or the new \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=F_qRlWffVzc\u0022\u003Eyoutube video\u003C\/a\u003E of my presentation at Stanford Webcamp.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EEdit: \u003C\/strong\u003EUpdated recipe installation instructions on 9\/19\/2025\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EAfter the success of my \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=F_qRlWffVzc\u0022\u003EStanford talk\u003C\/a\u003E, I thought I\u0027d take it to the next level. \u0026nbsp;The hot new thing in Drupal is recipes, which are part of Project Starshot. \u0026nbsp;(Short version: let\u0027s make Drupal easier to adopt.) In this case, that means a single recipe that will download and enable the modules you need to create your own AI chatbot - no code required!\u003C\/p\u003E\n\u003Cp\u003EThe bad news: You still need to configure the modules. \u0026nbsp;Right now, recipes are still pretty limited; there is no wizard to configure the modules for you. \u0026nbsp;(The Drupal community is already working on it, but there are bugs.) So, what does the recipe do? \u0026nbsp;It \u003Cstrong\u003Einstalls \u0026amp; enables\u003C\/strong\u003E the modules you need. \u0026nbsp;This is a process:\u003C\/p\u003E\n\u003Col style=\u0022-webkit-text-stroke-width:0px;background-color:rgb(255, 255, 255);border-width:0px;box-sizing:border-box;color:rgb(34, 34, 34);font-family:NotoSans, system-ui, sans-serif;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:normal;font-variant-alternates:inherit;font-variant-caps:normal;font-variant-east-asian:inherit;font-variant-emoji:inherit;font-variant-ligatures:normal;font-variant-numeric:inherit;font-variant-position:inherit;font-variation-settings:inherit;font-weight:400;letter-spacing:normal;line-height:inherit;list-style:outside decimal;margin:0px 0px 0.692em;orphans:2;padding:0px 0px 0px 2em;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;vertical-align:baseline;white-space:normal;widows:2;word-spacing:0px;\u0022\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003ESet \u0022minimum-stability\u0022: \u0022dev\u0022 in your composer.json\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EDownload the recipe: \u003Ca style=\u0022border-width:0px;box-sizing:border-box;color:rgb(0, 106, 169);font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;text-decoration:none;vertical-align:baseline;\u0022 href=\u0022https:\/\/www.drupal.org\/project\/ai_chatbot_recipe\u0022 rel=\u0022nofollow\u0022\u003Ehttps:\/\/www.drupal.org\/project\/ai_chatbot_recipe\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EStore in your `..\/recipes` folder\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EClear the cache: `drush cr`\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EEnable the recipe: `drush recipe ..\/recipes\/ai-chatbot-recipe`\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EConfigure the modules (each chatbot is unique)\u003C\/li\u003E\n\u003Cli style=\u0022border-width:0px;box-sizing:border-box;font-family:inherit;font-feature-settings:inherit;font-kerning:inherit;font-optical-sizing:inherit;font-size-adjust:inherit;font-size:16px;font-stretch:inherit;font-style:inherit;font-variant:inherit;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0px;padding:0px;vertical-align:baseline;\u0022\u003EGet API keys from OpenAI and Pinecone\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EFor next steps, check out \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/content\/building-rag-drupal-easy-way\u0022\u003Emy previous post\u003C\/a\u003E, or the new \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=F_qRlWffVzc\u0022\u003Eyoutube video\u003C\/a\u003E of my presentation at Stanford Webcamp.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EEdit: \u003C\/strong\u003EUpdated recipe installation instructions on 9\/19\/2025\u003C\/p\u003E\n","summary":"What\u0027s next?  How about a Drupal recipe!"}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1747683806,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[{"target_id":10,"alt":"illustration of a human shaking hands with a robot","title":"","width":1024,"height":1024,"target_type":"file","target_uuid":"b4d99f11-7bfe-4230-867d-20ae8645df81","url":"https:\/\/d10.koplowiczandsons.com\/sites\/default\/files\/field\/image\/img-wJQgOeoxk5qawnZCy8jxRkRu.png"}],"field_tags":[]},{"nid":[{"value":81}],"uuid":[{"value":"f8df9413-b6d6-4753-b589-f936c7459046"}],"vid":[{"value":404}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-03-31T19:07:27+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Building a RAG with Drupal: The Easy Way"}],"created":[{"value":"2025-03-31T18:18:12+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-03-31T19:07:27+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/building-rag-drupal-easy-way","pid":115,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EI \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/\u0022\u003Epreviously\u003C\/a\u003E blogged about building a RAG the \u0022hard\u0022 way, with a headless react interface, and a Python backend. \u0026nbsp;That involved a lot of \u003Cem\u003Emanual\u003C\/em\u003E construction, and wasn\u0027t very \u0022Drupal-like.\u0022 \u0026nbsp;(This isn\u0027t my first time building a headless React interface, and I have opinions about it.) BUT - what if I told you there\u0027s an easier way, using only contrib modules? \u0026nbsp;Read on!\u003C\/p\u003E\u003Ch2\u003EThe Basics\u003C\/h2\u003E\u003Cp\u003EIt starts with the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI module\u003C\/a\u003E. \u0026nbsp;It\u0027s not the \u003Cem\u003Eonly\u003C\/em\u003E option on drupal.org, but it has quickly grown an ecosystem around it. \u0026nbsp;There are lots of modules that \u003Cem\u003Erely\u003C\/em\u003E on the AI module, and we will use some of them. \u0026nbsp;Install \u0026amp; enable it using the normal methods (ideally, Composer + Drush). \u0026nbsp;In particular you\u0027ll want to enable the \u003Cstrong\u003EAI Core\u003C\/strong\u003E module.\u003C\/p\u003E\u003Cp\u003EWhat else? \u0026nbsp;You\u0027ll need a \u003Cstrong\u003Eprovider.\u003C\/strong\u003E\u0026nbsp;\u003C\/p\u003E\u003Ch2\u003EProvider\u003C\/h2\u003E\u003Cp\u003EI used \u003Ca href=\u0022https:\/\/platform.openai.com\/\u0022\u003EOpenAI\u003C\/a\u003E, because I already had an account there, and ChatGPT is a good option. \u0026nbsp;(Claude is also popular; YMMV.) In particular, you will need to:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003ERegister with the provider (ie. OpenAI)\u003C\/li\u003E\u003Cli\u003EProvide a credit card (sorry... I don\u0027t know anyone who provides a free api!)\u003C\/li\u003E\u003Cli\u003EGet an \u003Cstrong\u003Eapi key\u003C\/strong\u003E - remember to write it down somewhere safe, because they won\u0027t show it to you again.\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EOnce you have your api key safe, you\u0027ll need to enter it into your Drupal site. \u0026nbsp;You\u0027ll need several modules for this:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EOpenAI provider (or whoever you use)\u003C\/li\u003E\u003Cli\u003EAI Search\u003C\/li\u003E\u003Cli\u003EKey\u003C\/li\u003E\u003Cli\u003EAI Assistant API\u003C\/li\u003E\u003Cli\u003EAI Chatbot\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ESomeone said the AI module is like search_api for AI. \u0026nbsp;It\u0027s true, because you still need a \u003Cstrong\u003Eserver\u003C\/strong\u003E and an \u003Cstrong\u003Eindex. \u003C\/strong\u003E\u003Cem\u003EThis is where things get different:\u003C\/em\u003E AI doesn\u0027t use a relational database, like Drupal. \u0026nbsp;It uses a \u003Cem\u003Evector database\u003C\/em\u003E, so you\u0027ll need to set one up.\u003C\/p\u003E\u003Ch2\u003EVector DB\u003C\/h2\u003E\u003Cp\u003EThe vector database requires its own server. \u0026nbsp;I used \u003Ca href=\u0022https:\/\/www.pinecone.io\/\u0022\u003EPinecone\u003C\/a\u003E, because they have an awesome free tier. \u0026nbsp;Setup is simple, because we\u0027re not exporting or importing anything (the way I did in my last blog post). \u0026nbsp;Instead, the AI Search module handles it for us. \u0026nbsp;Even better: it plugs directly into the search_api module (thanks to AI Search). \u0026nbsp;Here are the steps:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EGet another \u003Cstrong\u003Eapi key\u003C\/strong\u003E - this time from Pinecone\u003C\/li\u003E\u003Cli\u003ESet up an empty database inside Pinecone, using their website\u003C\/li\u003E\u003Cli\u003EInstall \u0026amp; enable the \u003Cstrong\u003Eai_vdb_provider_pinecone\u003C\/strong\u003E module\u003C\/li\u003E\u003Cli\u003EGo to the Search API admin in your Drupal site: \/admin\/config\/search\/search-api\u003C\/li\u003E\u003Cli\u003EAdd your Pinecone server:\u003Col\u003E\u003Cli\u003EBackend: \u0022AI Search.\u0022\u003C\/li\u003E\u003Cli\u003EVector Database: \u0022Pinecone DB\u0022\u003C\/li\u003E\u003Cli\u003EDatabase Name: Choose the Pinecone db you created earlier\u003C\/li\u003E\u003Cli\u003EAdd a namespace (required)\u003C\/li\u003E\u003Cli\u003ESave\u003C\/li\u003E\u003C\/ol\u003E\u003C\/li\u003E\u003Cli\u003EAdd an index:\u003Col\u003E\u003Cli\u003EChoose an index name, eg. \u0022public\u0022\u003C\/li\u003E\u003Cli\u003ESelect the correct Datasources, eg. \u0022Content\u0022\u003C\/li\u003E\u003Cli\u003EServer: Pinecone (the server you created earlier)\u003C\/li\u003E\u003Cli\u003ECheck the \u0022Enabled\u0022 box\u003C\/li\u003E\u003Cli\u003EOptional: Add a description\u003C\/li\u003E\u003Cli\u003ESave\u003C\/li\u003E\u003C\/ol\u003E\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EDon\u0027t forget the \u003Cstrong\u003Eindex your data\u003C\/strong\u003E! \u0026nbsp;Note: This may take several minutes. \u0026nbsp;Indexing data in a vector database requires \u003Cem\u003Ecalculations;\u003C\/em\u003E it\u0027s not as simple as the relational db you\u0027re used to dealing with. \u0026nbsp;For more information, you can read up on what \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Vector_database\u0022\u003Emakes a vector db different\u003C\/a\u003E.\u003C\/p\u003E\u003Ch2\u003EAI Assistant\u003C\/h2\u003E\u003Cp\u003ENow you\u0027ve created your accounts with OpenAI and Pinecone, and you\u0027ve created API keys. \u0026nbsp;You\u0027ve connected your vector db, but now you need to create an \u0022assistant\u0022 who can read the database. \u0026nbsp;This is Retrieval Augmented Generation... you\u0027re about to create the actual RAG.\u003C\/p\u003E\u003Cp\u003ETo create your RAG:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EGo to the admin page: \/admin\/config\/ai\/ai-assistant\u003C\/li\u003E\u003Cli\u003EClick on \u0022Add AI Assistant\u0022\u003C\/li\u003E\u003Cli\u003EConfigure your new assistant:\u003Col\u003E\u003Cli\u003ELabel: Whatever you want\u003C\/li\u003E\u003Cli\u003ECheck the \u0022Enabled\u0022 box\u003C\/li\u003E\u003Cli\u003EInstructions: \u003Cem\u003EThis is important.\u003C\/em\u003E \u0026nbsp;Write a human-friendly prompt for your AI chatbot. \u0026nbsp;Here\u0027s an example:\u003Cbr\u003E\u003Cem\u003EAnswer the question based on the context, and if the question can\u0027t be answered based on the context, then try to suggest a similar topic that is available in the context. \u0026nbsp;Try to cite sources to the links in the context when possible.\u003C\/em\u003E\u003Cbr\u003EThis is known as \u003Cstrong\u003Efine tuning\u003C\/strong\u003E, and is the focus of a lot of work in generative AI. \u0026nbsp;The better your prompt, the better the chatbot answers will be. \u0026nbsp;How do you define \u0022better?\u0022 \u0026nbsp;That\u0027s entirely up to you, and your use case.\u003C\/li\u003E\u003Cli\u003ECheck the box to \u0022Enable RAG Actions\u0022\u003C\/li\u003E\u003Cli\u003EChoose the RAG database you created earlier\u003C\/li\u003E\u003Cli\u003ERAG description: This is also important; add a human-friendly explanation as to why your AI assistant should use this source.\u003C\/li\u003E\u003Cli\u003EAI Provider: Choose the AI provider you set up earlier (in my case, OpenAI)\u003C\/li\u003E\u003Cli\u003EModel: I picked something \u0022modern.\u0022 \u0026nbsp;At the time of my writing, that was gpt-4o. \u0026nbsp;This is another important decision; there was a newer \u0022o1\u0022 model available, but I found it gave worse answers. \u0026nbsp;YMMV.\u003C\/li\u003E\u003Cli\u003ESave\u003C\/li\u003E\u003C\/ol\u003E\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003ENice work - your \u003Cem\u003Ebackend\u003C\/em\u003E is complete. \u0026nbsp;In the words of a famous Star Trek engineer: \u0022Now we can begin.\u0022\u003C\/p\u003E\u003Ch2\u003EChatbot\u003C\/h2\u003E\u003Cp\u003ENow that we\u0027ve finished the backend, we can install the \u003Cem\u003Efrontend:\u003C\/em\u003E a chatbot that will interact with your web visitors. \u0026nbsp;No Discord server required; this chatbot will take questions directly on your website, in a little popup dialog:\u003C\/p\u003E\u003Cimg data-entity-uuid=\u00227472abc1-92f8-4ad6-8ccf-44cc8772bc92\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/SCR-20250331-kqyu.png\u0022 width=\u0022413\u0022 height=\u0022638\u0022 alt=\u0022screenshot shows a popup dialog box with an AI chatbot\u0022\u003E\u003Cp\u003EYou need to embed this chatbot somewhere. \u0026nbsp;Fortunately, it\u0027s available as a \u003Cstrong\u003Eblock. \u0026nbsp;\u003C\/strong\u003EEmbed the block on your site using the usual method:\u0026nbsp;\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EVisit the admin page: \/admin\/structure\/block\u003C\/li\u003E\u003Cli\u003ESelect the region where you want to embed your block. \u0026nbsp;Nothing needs to actually appear there, but for our purposes you have to pick \u003Cem\u003Esomewhere. \u003C\/em\u003EClick the \u0022Place Block\u0022 button for your desired region.\u003C\/li\u003E\u003Cli\u003ESelect \u0022AI Chatbot\u0022 from the list of available blocks\u003C\/li\u003E\u003Cli\u003ETitle: You have to give it a title, but you can un-check the box to \u003Cem\u003Edisplay\u003C\/em\u003E the title. \u0026nbsp;It\u0027s still visible on the admin page.\u003C\/li\u003E\u003Cli\u003EAI Assistant: Choose the assistant you just created (your RAG)\u003C\/li\u003E\u003Cli\u003EFirst Message: Also important; this is the first thing your chatbot will say to new visitors.\u003C\/li\u003E\u003Cli\u003EOptional: Restrict the chatbot to certain pages, content types, or roles. \u0026nbsp;This depends entirely on your use case.\u003C\/li\u003E\u003C\/ol\u003E\u003Ch2\u003EConclusion\u003C\/h2\u003E\u003Cp\u003EThat\u0027s it. \u0026nbsp;You\u0027re done. \u0026nbsp;You have a functional RAG that\u0027s visible to your users, and you did it without writing a single line of code. \u0026nbsp;(Fine tuning counts as coding, depending on who you ask.) Congratulations!\u003C\/p\u003E\u003Cp\u003EQuestions? \u0026nbsp;Complaints? \u0026nbsp;I don\u0027t take comments here, but please reach out to me directly: https:\/\/koplowiczandsons.com\/contact\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/\u0022\u003Epreviously\u003C\/a\u003E blogged about building a RAG the \u0022hard\u0022 way, with a headless react interface, and a Python backend. \u0026nbsp;That involved a lot of \u003Cem\u003Emanual\u003C\/em\u003E construction, and wasn\u0027t very \u0022Drupal-like.\u0022 \u0026nbsp;(This isn\u0027t my first time building a headless React interface, and I have opinions about it.) BUT - what if I told you there\u0027s an easier way, using only contrib modules? \u0026nbsp;Read on!\u003C\/p\u003E\n\u003Ch2\u003EThe Basics\u003C\/h2\u003E\n\u003Cp\u003EIt starts with the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI module\u003C\/a\u003E. \u0026nbsp;It\u0027s not the \u003Cem\u003Eonly\u003C\/em\u003E option on drupal.org, but it has quickly grown an ecosystem around it. \u0026nbsp;There are lots of modules that \u003Cem\u003Erely\u003C\/em\u003E on the AI module, and we will use some of them. \u0026nbsp;Install \u0026amp; enable it using the normal methods (ideally, Composer + Drush). \u0026nbsp;In particular you\u0027ll want to enable the \u003Cstrong\u003EAI Core\u003C\/strong\u003E module.\u003C\/p\u003E\n\u003Cp\u003EWhat else? \u0026nbsp;You\u0027ll need a \u003Cstrong\u003Eprovider.\u003C\/strong\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EProvider\u003C\/h2\u003E\n\u003Cp\u003EI used \u003Ca href=\u0022https:\/\/platform.openai.com\/\u0022\u003EOpenAI\u003C\/a\u003E, because I already had an account there, and ChatGPT is a good option. \u0026nbsp;(Claude is also popular; YMMV.) In particular, you will need to:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003ERegister with the provider (ie. OpenAI)\u003C\/li\u003E\n\u003Cli\u003EProvide a credit card (sorry... I don\u0027t know anyone who provides a free api!)\u003C\/li\u003E\n\u003Cli\u003EGet an \u003Cstrong\u003Eapi key\u003C\/strong\u003E - remember to write it down somewhere safe, because they won\u0027t show it to you again.\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EOnce you have your api key safe, you\u0027ll need to enter it into your Drupal site. \u0026nbsp;You\u0027ll need several modules for this:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EOpenAI provider (or whoever you use)\u003C\/li\u003E\n\u003Cli\u003EAI Search\u003C\/li\u003E\n\u003Cli\u003EKey\u003C\/li\u003E\n\u003Cli\u003EAI Assistant API\u003C\/li\u003E\n\u003Cli\u003EAI Chatbot\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ESomeone said the AI module is like search_api for AI. \u0026nbsp;It\u0027s true, because you still need a \u003Cstrong\u003Eserver\u003C\/strong\u003E and an \u003Cstrong\u003Eindex. \u003C\/strong\u003E\u003Cem\u003EThis is where things get different:\u003C\/em\u003E AI doesn\u0027t use a relational database, like Drupal. \u0026nbsp;It uses a \u003Cem\u003Evector database\u003C\/em\u003E, so you\u0027ll need to set one up.\u003C\/p\u003E\n\u003Ch2\u003EVector DB\u003C\/h2\u003E\n\u003Cp\u003EThe vector database requires its own server. \u0026nbsp;I used \u003Ca href=\u0022https:\/\/www.pinecone.io\/\u0022\u003EPinecone\u003C\/a\u003E, because they have an awesome free tier. \u0026nbsp;Setup is simple, because we\u0027re not exporting or importing anything (the way I did in my last blog post). \u0026nbsp;Instead, the AI Search module handles it for us. \u0026nbsp;Even better: it plugs directly into the search_api module (thanks to AI Search). \u0026nbsp;Here are the steps:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EGet another \u003Cstrong\u003Eapi key\u003C\/strong\u003E - this time from Pinecone\u003C\/li\u003E\n\u003Cli\u003ESet up an empty database inside Pinecone, using their website\u003C\/li\u003E\n\u003Cli\u003EInstall \u0026amp; enable the \u003Cstrong\u003Eai_vdb_provider_pinecone\u003C\/strong\u003E module\u003C\/li\u003E\n\u003Cli\u003EGo to the Search API admin in your Drupal site: \/admin\/config\/search\/search-api\u003C\/li\u003E\n\u003Cli\u003EAdd your Pinecone server:\n\u003Col\u003E\n\u003Cli\u003EBackend: \u0022AI Search.\u0022\u003C\/li\u003E\n\u003Cli\u003EVector Database: \u0022Pinecone DB\u0022\u003C\/li\u003E\n\u003Cli\u003EDatabase Name: Choose the Pinecone db you created earlier\u003C\/li\u003E\n\u003Cli\u003EAdd a namespace (required)\u003C\/li\u003E\n\u003Cli\u003ESave\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003C\/li\u003E\n\u003Cli\u003EAdd an index:\n\u003Col\u003E\n\u003Cli\u003EChoose an index name, eg. \u0022public\u0022\u003C\/li\u003E\n\u003Cli\u003ESelect the correct Datasources, eg. \u0022Content\u0022\u003C\/li\u003E\n\u003Cli\u003EServer: Pinecone (the server you created earlier)\u003C\/li\u003E\n\u003Cli\u003ECheck the \u0022Enabled\u0022 box\u003C\/li\u003E\n\u003Cli\u003EOptional: Add a description\u003C\/li\u003E\n\u003Cli\u003ESave\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EDon\u0027t forget the \u003Cstrong\u003Eindex your data\u003C\/strong\u003E! \u0026nbsp;Note: This may take several minutes. \u0026nbsp;Indexing data in a vector database requires \u003Cem\u003Ecalculations;\u003C\/em\u003E it\u0027s not as simple as the relational db you\u0027re used to dealing with. \u0026nbsp;For more information, you can read up on what \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Vector_database\u0022\u003Emakes a vector db different\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ch2\u003EAI Assistant\u003C\/h2\u003E\n\u003Cp\u003ENow you\u0027ve created your accounts with OpenAI and Pinecone, and you\u0027ve created API keys. \u0026nbsp;You\u0027ve connected your vector db, but now you need to create an \u0022assistant\u0022 who can read the database. \u0026nbsp;This is Retrieval Augmented Generation... you\u0027re about to create the actual RAG.\u003C\/p\u003E\n\u003Cp\u003ETo create your RAG:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EGo to the admin page: \/admin\/config\/ai\/ai-assistant\u003C\/li\u003E\n\u003Cli\u003EClick on \u0022Add AI Assistant\u0022\u003C\/li\u003E\n\u003Cli\u003EConfigure your new assistant:\n\u003Col\u003E\n\u003Cli\u003ELabel: Whatever you want\u003C\/li\u003E\n\u003Cli\u003ECheck the \u0022Enabled\u0022 box\u003C\/li\u003E\n\u003Cli\u003EInstructions: \u003Cem\u003EThis is important.\u003C\/em\u003E \u0026nbsp;Write a human-friendly prompt for your AI chatbot. \u0026nbsp;Here\u0027s an example:\u003Cbr\u003E\u003Cem\u003EAnswer the question based on the context, and if the question can\u0027t be answered based on the context, then try to suggest a similar topic that is available in the context. \u0026nbsp;Try to cite sources to the links in the context when possible.\u003C\/em\u003E\u003Cbr\u003EThis is known as \u003Cstrong\u003Efine tuning\u003C\/strong\u003E, and is the focus of a lot of work in generative AI. \u0026nbsp;The better your prompt, the better the chatbot answers will be. \u0026nbsp;How do you define \u0022better?\u0022 \u0026nbsp;That\u0027s entirely up to you, and your use case.\u003C\/li\u003E\n\u003Cli\u003ECheck the box to \u0022Enable RAG Actions\u0022\u003C\/li\u003E\n\u003Cli\u003EChoose the RAG database you created earlier\u003C\/li\u003E\n\u003Cli\u003ERAG description: This is also important; add a human-friendly explanation as to why your AI assistant should use this source.\u003C\/li\u003E\n\u003Cli\u003EAI Provider: Choose the AI provider you set up earlier (in my case, OpenAI)\u003C\/li\u003E\n\u003Cli\u003EModel: I picked something \u0022modern.\u0022 \u0026nbsp;At the time of my writing, that was gpt-4o. \u0026nbsp;This is another important decision; there was a newer \u0022o1\u0022 model available, but I found it gave worse answers. \u0026nbsp;YMMV.\u003C\/li\u003E\n\u003Cli\u003ESave\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003ENice work - your \u003Cem\u003Ebackend\u003C\/em\u003E is complete. \u0026nbsp;In the words of a famous Star Trek engineer: \u0022Now we can begin.\u0022\u003C\/p\u003E\n\u003Ch2\u003EChatbot\u003C\/h2\u003E\n\u003Cp\u003ENow that we\u0027ve finished the backend, we can install the \u003Cem\u003Efrontend:\u003C\/em\u003E a chatbot that will interact with your web visitors. \u0026nbsp;No Discord server required; this chatbot will take questions directly on your website, in a little popup dialog:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg data-entity-uuid=\u00227472abc1-92f8-4ad6-8ccf-44cc8772bc92\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/SCR-20250331-kqyu.png\u0022 width=\u0022413\u0022 height=\u0022638\u0022 alt=\u0022screenshot shows a popup dialog box with an AI chatbot\u0022\u003E\n\u003Cp\u003EYou need to embed this chatbot somewhere. \u0026nbsp;Fortunately, it\u0027s available as a \u003Cstrong\u003Eblock. \u0026nbsp;\u003C\/strong\u003EEmbed the block on your site using the usual method:\u0026nbsp;\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EVisit the admin page: \/admin\/structure\/block\u003C\/li\u003E\n\u003Cli\u003ESelect the region where you want to embed your block. \u0026nbsp;Nothing needs to actually appear there, but for our purposes you have to pick \u003Cem\u003Esomewhere. \u003C\/em\u003EClick the \u0022Place Block\u0022 button for your desired region.\u003C\/li\u003E\n\u003Cli\u003ESelect \u0022AI Chatbot\u0022 from the list of available blocks\u003C\/li\u003E\n\u003Cli\u003ETitle: You have to give it a title, but you can un-check the box to \u003Cem\u003Edisplay\u003C\/em\u003E the title. \u0026nbsp;It\u0027s still visible on the admin page.\u003C\/li\u003E\n\u003Cli\u003EAI Assistant: Choose the assistant you just created (your RAG)\u003C\/li\u003E\n\u003Cli\u003EFirst Message: Also important; this is the first thing your chatbot will say to new visitors.\u003C\/li\u003E\n\u003Cli\u003EOptional: Restrict the chatbot to certain pages, content types, or roles. \u0026nbsp;This depends entirely on your use case.\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Ch2\u003EConclusion\u003C\/h2\u003E\n\u003Cp\u003EThat\u0027s it. \u0026nbsp;You\u0027re done. \u0026nbsp;You have a functional RAG that\u0027s visible to your users, and you did it without writing a single line of code. \u0026nbsp;(Fine tuning counts as coding, depending on who you ask.) Congratulations!\u003C\/p\u003E\n\u003Cp\u003EQuestions? \u0026nbsp;Complaints? \u0026nbsp;I don\u0027t take comments here, but please reach out to me directly: \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/contact\u0022\u003Ehttps:\/\/koplowiczandsons.com\/contact\u003C\/a\u003E\u003C\/p\u003E\n","summary":"What if I told you there\u0027s an easier way, using only contrib modules?"}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1743446656,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":80}],"uuid":[{"value":"865a61e2-dfad-4dda-ae66-e235ebd50a41"}],"vid":[{"value":402}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-03-17T19:27:30+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"I Added a Chatbot"}],"created":[{"value":"2025-03-17T17:38:26+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-03-17T19:27:30+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/i-added-chatbot","pid":114,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EI programmed an AI chatbot! It is a retrieval augmented generation (RAG) model. It has been trained on the content of my professional blog here at koplowiczandsons.com. It can now answer questions based on the blog\u2019s information.\u003C\/p\u003E\u003Cp\u003EI actually wrote the bot a year ago, and hooked it up to a Discord server, but never took it further than that. \u0026nbsp;The challenge here was to hook up the bot to a website instead of Discord. \u0026nbsp;It\u0027s a completely different type of challenge, because Discord handles all the api calls. \u0026nbsp;With my website, I had to handle api calls myself. \u0026nbsp;That means \u003Cem\u003Ea third server:\u003C\/em\u003E\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/KandS%20architecture%202025.jpg\u0022 data-entity-uuid=\u00222bcb4fc4-28f5-4ac0-8745-a86102e16e92\u0022 data-entity-type=\u0022file\u0022 alt=\u0022Table explaining the website architecture\u0022 width=\u0022555\u0022 height=\u0022256\u0022\u003E\u003Cp\u003EI recently upgraded koplowiczandsons.com to the latest version of Drupal, and used the opportunity to turn it into a \u003Cstrong\u003Eheadless Drupal\u003C\/strong\u003E site, with a \u003Cstrong\u003EReact frontend. \u0026nbsp;\u003C\/strong\u003EAs part of this process, I upgraded the web server from Apache to Nginx (which I already blogged about). \u0026nbsp;So now I have a LEMP stack - but that doesn\u0027t get me the frontend, or the chatbot.\u003C\/p\u003E\u003Cp\u003EThe frontend requires node, which needs to be \u003Cem\u003Ecompiled\u003C\/em\u003E after it is deployed. \u0026nbsp;I solve this with some CI\/CD, courtesy of Github Actions. \u0026nbsp;(Github makes this process easy, since it\u0027s where my code is stored anyway.) So now, I can push the frontend and backend simultaneously, and the CI takes the following steps:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EFor the backend:\u003Col\u003E\u003Cli\u003Ecomposer install\u003C\/li\u003E\u003Cli\u003Edrush deploy\u003C\/li\u003E\u003C\/ol\u003E\u003C\/li\u003E\u003Cli\u003EAnd for the frontend:\u003Col\u003E\u003Cli\u003Enpm install\u003C\/li\u003E\u003Cli\u003Enpm run build\u003C\/li\u003E\u003C\/ol\u003E\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EAll I have to do is a simple \u0022git push,\u0022 and it deploys everything for me automagically. \u0026nbsp;BUT, that still doesn\u0027t get me a chatbot!\u003C\/p\u003E\u003Cp\u003ESolution: a simple Medium post from last Fall, which gives advice on building the React (frontend) side of the chatbot interface. \u0026nbsp;I pretty much lifted the code straight from the blog post (although I simplified it somewhat). \u0026nbsp;That gave me a frontend which I could incorporate into my existing website. \u0026nbsp;You can try it now: \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/chatbot\u0022\u003Ehttps:\/\/koplowiczandsons.com\/chatbot\u003C\/a\u003E. But, I didn\u0027t have a way to connect my Discord bot to my website.\u003C\/p\u003E\u003Cp\u003EThe solution: build my own API layer. \u0026nbsp;There\u0027s a fantastic library just for that, called \u003Ca href=\u0022https:\/\/fastapi.tiangolo.com\/\u0022\u003EFastAPI\u003C\/a\u003E. \u0026nbsp;Their website includes great instructions for setting up a simple API endpoint. \u0026nbsp;It\u0027s even self-documenting (if that\u0027s something you need). \u0026nbsp;All I had to do was hook up the \u003Cstrong\u003Efetch()\u003C\/strong\u003E request in the frontend to the API endpoint I had just created.\u003C\/p\u003E\u003Cp\u003EChallenges included CORS, which protects web browsers against \u0022dangerous\u0022 connections between one website and another. \u0026nbsp;I had to add a lot of extra config to both the frontend and the backend to make that work.\u003C\/p\u003E\u003Cp\u003EWhat helped? \u0026nbsp;I used the AWS AI chatbot, which has a client for PhpStorm (my code editor of choice). \u0026nbsp;Whenever I got stuck, I simply asked the chatbot a question, and it was able to give me advice to move forward. \u0026nbsp;Sometimes I resorted to debug output, but most of the time, the chatbot was able to understand my context and give me useful advice. \u0026nbsp;It didn\u0027t build the app for me, and in my experience, no AI can do that on its own. \u0026nbsp;The best result still comes from having a human drive. \u0026nbsp;But I want to give credit where it\u0027s due; I would have struggled with things like nginx configuration, and using AI made the task a lot faster.\u003C\/p\u003E\u003Cp\u003EOther things I tried, which didn\u0027t work: \u003Cstrong\u003ELangchain:\u003C\/strong\u003E it\u0027s a great platform for prototyping AI chatbots (including RAGs), but it doesn\u0027t have a free solution for the frontend. \u0026nbsp;I would have had to rewrite the entire chatbot, and \u003Cem\u003Ethen \u003C\/em\u003Efigure out how to hook it up to my frontend anyway. \u0026nbsp;So, it didn\u0027t save me any work.\u003C\/p\u003E\u003Cp\u003EFinally, a word about \u003Cstrong\u003Efine tuning. \u003C\/strong\u003EMy original chatbot prompt asked the AI to say \u0022Jordan doesn\u0027t know\u0022 whenever it had trouble answering a question. \u0026nbsp;That led to some hilarious answers:\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/jordan%20doesnt%20know.png\u0022 data-entity-uuid=\u0022974c88b0-7c28-45aa-9d5c-07faa46b3b57\u0022 data-entity-type=\u0022file\u0022 alt=\u0022\u0026quot;Jordan doesn\u0026apos;t know how to make an old fashioned,\u0026quot; etc.\u0022 width=\u0022488\u0022 height=\u0022202\u0022\u003E\u003Cp\u003EThe solution is a process known as fine tuning. \u0026nbsp;It basically means giving the AI a better prompt, so it knows how to answer questions more accurately. \u0026nbsp;In my case, people kept asking it questions that weren\u0027t related to the content of my blog, so the AI got choked up and didn\u0027t know how to answer. \u0026nbsp;I edited the prompt so if it had trouble answering, it could suggest an alternative topic instead. \u0026nbsp;This led to much more elegant answers, even in response to humorous questions:\u003C\/p\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/better%20response.jpeg\u0022 data-entity-uuid=\u0022e4ee5690-bd72-4c94-958e-819c2c41ffce\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot showing better response to the question: \u0026quot;What\u0026apos;s a website?\u0026quot;\u0022 width=\u00221164\u0022 height=\u00221328\u0022\u003E\u003Cp\u003EIf I wanted to keep going, I would encourage the AI to recommend Drupal over WordPress, but that would be a case of me imposing my own bias on the AI!\u003C\/p\u003E\u003Cp\u003EThe result: a finely tuned AI that can answer questions based on the content of my professional blog. \u0026nbsp;Have fun!\u003C\/p\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/koplowiczandsons.com\/chatbot\u0022\u003Ehttps:\/\/koplowiczandsons.com\/chatbot\u003C\/a\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI programmed an AI chatbot! It is a retrieval augmented generation (RAG) model. It has been trained on the content of my professional blog here at koplowiczandsons.com. It can now answer questions based on the blog\u2019s information.\u003C\/p\u003E\n\u003Cp\u003EI actually wrote the bot a year ago, and hooked it up to a Discord server, but never took it further than that. \u0026nbsp;The challenge here was to hook up the bot to a website instead of Discord. \u0026nbsp;It\u0027s a completely different type of challenge, because Discord handles all the api calls. \u0026nbsp;With my website, I had to handle api calls myself. \u0026nbsp;That means \u003Cem\u003Ea third server:\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/KandS%20architecture%202025.jpg\u0022 data-entity-uuid=\u00222bcb4fc4-28f5-4ac0-8745-a86102e16e92\u0022 data-entity-type=\u0022file\u0022 alt=\u0022Table explaining the website architecture\u0022 width=\u0022555\u0022 height=\u0022256\u0022\u003E\n\u003Cp\u003EI recently upgraded koplowiczandsons.com to the latest version of Drupal, and used the opportunity to turn it into a \u003Cstrong\u003Eheadless Drupal\u003C\/strong\u003E site, with a \u003Cstrong\u003EReact frontend. \u0026nbsp;\u003C\/strong\u003EAs part of this process, I upgraded the web server from Apache to Nginx (which I already blogged about). \u0026nbsp;So now I have a LEMP stack - but that doesn\u0027t get me the frontend, or the chatbot.\u003C\/p\u003E\n\u003Cp\u003EThe frontend requires node, which needs to be \u003Cem\u003Ecompiled\u003C\/em\u003E after it is deployed. \u0026nbsp;I solve this with some CI\/CD, courtesy of Github Actions. \u0026nbsp;(Github makes this process easy, since it\u0027s where my code is stored anyway.) So now, I can push the frontend and backend simultaneously, and the CI takes the following steps:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EFor the backend:\n\u003Col\u003E\n\u003Cli\u003Ecomposer install\u003C\/li\u003E\n\u003Cli\u003Edrush deploy\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003C\/li\u003E\n\u003Cli\u003EAnd for the frontend:\n\u003Col\u003E\n\u003Cli\u003Enpm install\u003C\/li\u003E\n\u003Cli\u003Enpm run build\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EAll I have to do is a simple \u0022git push,\u0022 and it deploys everything for me automagically. \u0026nbsp;BUT, that still doesn\u0027t get me a chatbot!\u003C\/p\u003E\n\u003Cp\u003ESolution: a simple Medium post from last Fall, which gives advice on building the React (frontend) side of the chatbot interface. \u0026nbsp;I pretty much lifted the code straight from the blog post (although I simplified it somewhat). \u0026nbsp;That gave me a frontend which I could incorporate into my existing website. \u0026nbsp;You can try it now: \u003Ca href=\u0022https:\/\/koplowiczandsons.com\/chatbot\u0022\u003Ehttps:\/\/koplowiczandsons.com\/chatbot\u003C\/a\u003E. But, I didn\u0027t have a way to connect my Discord bot to my website.\u003C\/p\u003E\n\u003Cp\u003EThe solution: build my own API layer. \u0026nbsp;There\u0027s a fantastic library just for that, called \u003Ca href=\u0022https:\/\/fastapi.tiangolo.com\/\u0022\u003EFastAPI\u003C\/a\u003E. \u0026nbsp;Their website includes great instructions for setting up a simple API endpoint. \u0026nbsp;It\u0027s even self-documenting (if that\u0027s something you need). \u0026nbsp;All I had to do was hook up the \u003Cstrong\u003Efetch()\u003C\/strong\u003E request in the frontend to the API endpoint I had just created.\u003C\/p\u003E\n\u003Cp\u003EChallenges included CORS, which protects web browsers against \u0022dangerous\u0022 connections between one website and another. \u0026nbsp;I had to add a lot of extra config to both the frontend and the backend to make that work.\u003C\/p\u003E\n\u003Cp\u003EWhat helped? \u0026nbsp;I used the AWS AI chatbot, which has a client for PhpStorm (my code editor of choice). \u0026nbsp;Whenever I got stuck, I simply asked the chatbot a question, and it was able to give me advice to move forward. \u0026nbsp;Sometimes I resorted to debug output, but most of the time, the chatbot was able to understand my context and give me useful advice. \u0026nbsp;It didn\u0027t build the app for me, and in my experience, no AI can do that on its own. \u0026nbsp;The best result still comes from having a human drive. \u0026nbsp;But I want to give credit where it\u0027s due; I would have struggled with things like nginx configuration, and using AI made the task a lot faster.\u003C\/p\u003E\n\u003Cp\u003EOther things I tried, which didn\u0027t work: \u003Cstrong\u003ELangchain:\u003C\/strong\u003E it\u0027s a great platform for prototyping AI chatbots (including RAGs), but it doesn\u0027t have a free solution for the frontend. \u0026nbsp;I would have had to rewrite the entire chatbot, and \u003Cem\u003Ethen \u003C\/em\u003Efigure out how to hook it up to my frontend anyway. \u0026nbsp;So, it didn\u0027t save me any work.\u003C\/p\u003E\n\u003Cp\u003EFinally, a word about \u003Cstrong\u003Efine tuning. \u003C\/strong\u003EMy original chatbot prompt asked the AI to say \u0022Jordan doesn\u0027t know\u0022 whenever it had trouble answering a question. \u0026nbsp;That led to some hilarious answers:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/jordan%20doesnt%20know.png\u0022 data-entity-uuid=\u0022974c88b0-7c28-45aa-9d5c-07faa46b3b57\u0022 data-entity-type=\u0022file\u0022 alt=\u0022\u0026quot;Jordan doesn\u0027t know how to make an old fashioned,\u0026quot; etc.\u0022 width=\u0022488\u0022 height=\u0022202\u0022\u003E\n\u003Cp\u003EThe solution is a process known as fine tuning. \u0026nbsp;It basically means giving the AI a better prompt, so it knows how to answer questions more accurately. \u0026nbsp;In my case, people kept asking it questions that weren\u0027t related to the content of my blog, so the AI got choked up and didn\u0027t know how to answer. \u0026nbsp;I edited the prompt so if it had trouble answering, it could suggest an alternative topic instead. \u0026nbsp;This led to much more elegant answers, even in response to humorous questions:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/sites\/default\/files\/inline-images\/better%20response.jpeg\u0022 data-entity-uuid=\u0022e4ee5690-bd72-4c94-958e-819c2c41ffce\u0022 data-entity-type=\u0022file\u0022 alt=\u0022screenshot showing better response to the question: \u0026quot;What\u0027s a website?\u0026quot;\u0022 width=\u00221164\u0022 height=\u00221328\u0022\u003E\n\u003Cp\u003EIf I wanted to keep going, I would encourage the AI to recommend Drupal over WordPress, but that would be a case of me imposing my own bias on the AI!\u003C\/p\u003E\n\u003Cp\u003EThe result: a finely tuned AI that can answer questions based on the content of my professional blog. \u0026nbsp;Have fun!\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/koplowiczandsons.com\/chatbot\u0022\u003Ehttps:\/\/koplowiczandsons.com\/chatbot\u003C\/a\u003E\u003C\/p\u003E\n","summary":"Everybody\u0027s doing it."}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1742233235,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":79}],"uuid":[{"value":"0fa6d779-e889-432a-8ec5-441209e4f928"}],"vid":[{"value":397}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-03-06T00:20:25+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Google Consent, Drupal, and You"}],"created":[{"value":"2025-03-05T21:44:30+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-03-06T00:20:25+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/google-consent-drupal-and-you","pid":113,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EI recently wrestled with the new Google Consent layer while building a new website. \u0026nbsp;Here\u0027s my story.\u003C\/p\u003E\u003Ch2\u003EWhy Bother\u003C\/h2\u003E\u003Cp\u003EShort answer: you \u003Cstrong\u003Eprobably don\u0027t need this. \u003C\/strong\u003EI was able to do basic Google Analytics without Google Tag Manager or Consent, and it worked just fine.\u003C\/p\u003E\u003Cp\u003ELong answer: I needed this because my boss wanted \u003Cstrong\u003Ecustom variables in Google Analytics.\u003C\/strong\u003E The way to pass those variables is through GTM. \u0026nbsp;You need to hook up the telemetry (with custom dimensions), but you \u003Cem\u003Ealso\u003C\/em\u003E need consent from your users.\u003C\/p\u003E\u003Ch2\u003EHow to Do It\u003C\/h2\u003E\u003Cp\u003EFor your Drupal site, you need only two moving parts:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/google_tag\u0022\u003EGoogle Tag\u003C\/a\u003E module\u003C\/li\u003E\u003Cli\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/consent_manager\u0022\u003EConsent Manager\u003C\/a\u003E module\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EInstall and enable both using the normal methods. \u0026nbsp;Optional: \u003Cstrong\u003Epatch\u003C\/strong\u003E the Google Tag module, in order to \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/google_tag\/issues\/3106318\u0022\u003Eadd Google Consent v2 support\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EYou will also need to set up several external accounts, to connect all the moving pieces:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/analytics.google.com\/\u0022\u003EGoogle Analytics\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/tagmanager.google.com\/\u0022\u003EGoogle Tag Manager\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.consentmanager.net\/en\/\u0022\u003EConsent Manager\u003C\/a\u003E (note: this is a paid, 3rd party service)\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EFor each service, you\u0027ll need to register and configure your website. \u0026nbsp;Both the Google Tag module, and the Consent Manager module, require configuration \u003Cem\u003Eafter\u003C\/em\u003E you\u0027ve registered with those services.\u003C\/p\u003E\u003Cp\u003EAssuming you configured GTM and Consent Manager correctly, you are now streaming data to Google Analytics. \u0026nbsp;Congratulations! \u0026nbsp;Now, you can create your custom variable.\u003C\/p\u003E\u003Ch3\u003EDrupal: Create a Dimension\u003C\/h3\u003E\u003Cp\u003ELog in to your Drupal site as an administrator, then visit the Google Tag admin page: \/admin\/config\/services\/google-tag. Once there, scroll to the \u0022Custom dimensions and metrics\u0022 section and click \u003Cstrong\u003EAdd new parameter. \u003C\/strong\u003EYou need to choose whether you\u0027re creating a \u003Cstrong\u003Edimensions\u003C\/strong\u003E or a \u003Cstrong\u003Emetric. \u0026nbsp;\u003C\/strong\u003EWhen in doubt, choose \u003Cstrong\u003Edimension. \u0026nbsp;\u003C\/strong\u003EThe \u003Cstrong\u003Ename\u003C\/strong\u003E should be human-friendly. \u0026nbsp;For the \u003Cstrong\u003Evalue\u003C\/strong\u003E field, click the \u003Cstrong\u003EBrowse available tokens\u003C\/strong\u003E link for a list of options.\u003C\/p\u003E\u003Cp\u003EScroll down and click \u003Cstrong\u003ESave\u003C\/strong\u003E at the bottom of the page when finished.\u003C\/p\u003E\u003Ch3\u003EGTM: Add a Dimension\u003C\/h3\u003E\u003Cp\u003EThe next two steps involve Google Tag Manager and Google Analytics directly. \u0026nbsp;Google has a fantastic help article on \u003Ca href=\u0022https:\/\/support.google.com\/analytics\/answer\/14239618\u0022\u003ECreating user-scoped custom dimensions\u003C\/a\u003E. \u0026nbsp;Here\u0027s a summary:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EVisit GTM and create the Dimension based on the \u003Cstrong\u003Ename\u003C\/strong\u003E you chose earlier\u003C\/li\u003E\u003Cli\u003E\u0022Submit\u0022 the GTM changes to publish a new version\u003C\/li\u003E\u003Cli\u003EGo to Google Analytics and define your new Dimension there\u003C\/li\u003E\u003Cli\u003ECreate data visualizations in GA to view your new Dimension in action\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003ESome notes to remember:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EData will take a few minutes to start flowing, even if you have an active user base\u003C\/li\u003E\u003Cli\u003EYou can use the \u003Ca href=\u0022https:\/\/tagassistant.google.com\/\u0022\u003ETag Assistant\u003C\/a\u003E to test your telemetry\u003C\/li\u003E\u003C\/ul\u003E\u003Ch2\u003EWhat\u0027s Wrong with Free?\u003C\/h2\u003E\u003Cp\u003EIn other words: \u0022Why use a paid service?\u0022 \u0026nbsp;If you\u0027ve read my blog before, you know I\u0027m all about FOSS. \u0026nbsp;So, let\u0027s look at the two free options for Drupal, and see why they don\u0027t stack up.\u003C\/p\u003E\u003Ch3\u003ECookies\u003C\/h3\u003E\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/cookies\/\u0022\u003ECOOKiES Consent Management\u003C\/a\u003E module is most popular module on Drupal.org to handle consent management. \u0026nbsp;However, Google released \u003Cem\u003Eversion 2\u003C\/em\u003E of their Consent api last year, and the Cookies module hasn\u0027t caught up yet. \u0026nbsp;(There is an issue open for this, with a patch, but it wouldn\u0027t work in my testing.)\u003C\/p\u003E\u003Ch3\u003EKlaro\u003C\/h3\u003E\u003Cp\u003ENot only is \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/klaro\u0022\u003EKlaro\u003C\/a\u003E also popular, but it was recently chosen to be \u003Cem\u003Ethe \u003C\/em\u003Econsent solution for Drupal CMS. \u0026nbsp;Impressive... but I couldn\u0027t get it to work either. \u0026nbsp;(There are multiple open issues for this, with patches... but they didn\u0027t work in my real-world tests.)\u003C\/p\u003E\u003Cp\u003EEnter \u003Ca href=\u0022https:\/\/www.consentmanager.net\/en\/\u0022\u003E\u003Cstrong\u003Econsentmanager.net\u003C\/strong\u003E\u003C\/a\u003E\u003Cstrong\u003E. \u0026nbsp;\u003C\/strong\u003EThey are a paid service with a free tier, and they provide a contrib module for Drupal. \u0026nbsp;I was able to get it working quickly and easily, and they didn\u0027t even ask for a credit card. \u0026nbsp;This is definitely my preferred solution for commercial websites.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI recently wrestled with the new Google Consent layer while building a new website. \u0026nbsp;Here\u0027s my story.\u003C\/p\u003E\n\u003Ch2\u003EWhy Bother\u003C\/h2\u003E\n\u003Cp\u003EShort answer: you \u003Cstrong\u003Eprobably don\u0027t need this. \u003C\/strong\u003EI was able to do basic Google Analytics without Google Tag Manager or Consent, and it worked just fine.\u003C\/p\u003E\n\u003Cp\u003ELong answer: I needed this because my boss wanted \u003Cstrong\u003Ecustom variables in Google Analytics.\u003C\/strong\u003E The way to pass those variables is through GTM. \u0026nbsp;You need to hook up the telemetry (with custom dimensions), but you \u003Cem\u003Ealso\u003C\/em\u003E need consent from your users.\u003C\/p\u003E\n\u003Ch2\u003EHow to Do It\u003C\/h2\u003E\n\u003Cp\u003EFor your Drupal site, you need only two moving parts:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/google_tag\u0022\u003EGoogle Tag\u003C\/a\u003E module\u003C\/li\u003E\n\u003Cli\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/consent_manager\u0022\u003EConsent Manager\u003C\/a\u003E module\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EInstall and enable both using the normal methods. \u0026nbsp;Optional: \u003Cstrong\u003Epatch\u003C\/strong\u003E the Google Tag module, in order to \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/google_tag\/issues\/3106318\u0022\u003Eadd Google Consent v2 support\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EYou will also need to set up several external accounts, to connect all the moving pieces:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/analytics.google.com\/\u0022\u003EGoogle Analytics\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/tagmanager.google.com\/\u0022\u003EGoogle Tag Manager\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.consentmanager.net\/en\/\u0022\u003EConsent Manager\u003C\/a\u003E (note: this is a paid, 3rd party service)\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EFor each service, you\u0027ll need to register and configure your website. \u0026nbsp;Both the Google Tag module, and the Consent Manager module, require configuration \u003Cem\u003Eafter\u003C\/em\u003E you\u0027ve registered with those services.\u003C\/p\u003E\n\u003Cp\u003EAssuming you configured GTM and Consent Manager correctly, you are now streaming data to Google Analytics. \u0026nbsp;Congratulations! \u0026nbsp;Now, you can create your custom variable.\u003C\/p\u003E\n\u003Ch3\u003EDrupal: Create a Dimension\u003C\/h3\u003E\n\u003Cp\u003ELog in to your Drupal site as an administrator, then visit the Google Tag admin page: \/admin\/config\/services\/google-tag. Once there, scroll to the \u0022Custom dimensions and metrics\u0022 section and click \u003Cstrong\u003EAdd new parameter. \u003C\/strong\u003EYou need to choose whether you\u0027re creating a \u003Cstrong\u003Edimensions\u003C\/strong\u003E or a \u003Cstrong\u003Emetric. \u0026nbsp;\u003C\/strong\u003EWhen in doubt, choose \u003Cstrong\u003Edimension. \u0026nbsp;\u003C\/strong\u003EThe \u003Cstrong\u003Ename\u003C\/strong\u003E should be human-friendly. \u0026nbsp;For the \u003Cstrong\u003Evalue\u003C\/strong\u003E field, click the \u003Cstrong\u003EBrowse available tokens\u003C\/strong\u003E link for a list of options.\u003C\/p\u003E\n\u003Cp\u003EScroll down and click \u003Cstrong\u003ESave\u003C\/strong\u003E at the bottom of the page when finished.\u003C\/p\u003E\n\u003Ch3\u003EGTM: Add a Dimension\u003C\/h3\u003E\n\u003Cp\u003EThe next two steps involve Google Tag Manager and Google Analytics directly. \u0026nbsp;Google has a fantastic help article on \u003Ca href=\u0022https:\/\/support.google.com\/analytics\/answer\/14239618\u0022\u003ECreating user-scoped custom dimensions\u003C\/a\u003E. \u0026nbsp;Here\u0027s a summary:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EVisit GTM and create the Dimension based on the \u003Cstrong\u003Ename\u003C\/strong\u003E you chose earlier\u003C\/li\u003E\n\u003Cli\u003E\u0022Submit\u0022 the GTM changes to publish a new version\u003C\/li\u003E\n\u003Cli\u003EGo to Google Analytics and define your new Dimension there\u003C\/li\u003E\n\u003Cli\u003ECreate data visualizations in GA to view your new Dimension in action\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003ESome notes to remember:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EData will take a few minutes to start flowing, even if you have an active user base\u003C\/li\u003E\n\u003Cli\u003EYou can use the \u003Ca href=\u0022https:\/\/tagassistant.google.com\/\u0022\u003ETag Assistant\u003C\/a\u003E to test your telemetry\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch2\u003EWhat\u0027s Wrong with Free?\u003C\/h2\u003E\n\u003Cp\u003EIn other words: \u0022Why use a paid service?\u0022 \u0026nbsp;If you\u0027ve read my blog before, you know I\u0027m all about FOSS. \u0026nbsp;So, let\u0027s look at the two free options for Drupal, and see why they don\u0027t stack up.\u003C\/p\u003E\n\u003Ch3\u003ECookies\u003C\/h3\u003E\n\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/cookies\/\u0022\u003ECOOKiES Consent Management\u003C\/a\u003E module is most popular module on Drupal.org to handle consent management. \u0026nbsp;However, Google released \u003Cem\u003Eversion 2\u003C\/em\u003E of their Consent api last year, and the Cookies module hasn\u0027t caught up yet. \u0026nbsp;(There is an issue open for this, with a patch, but it wouldn\u0027t work in my testing.)\u003C\/p\u003E\n\u003Ch3\u003EKlaro\u003C\/h3\u003E\n\u003Cp\u003ENot only is \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/klaro\u0022\u003EKlaro\u003C\/a\u003E also popular, but it was recently chosen to be \u003Cem\u003Ethe \u003C\/em\u003Econsent solution for Drupal CMS. \u0026nbsp;Impressive... but I couldn\u0027t get it to work either. \u0026nbsp;(There are multiple open issues for this, with patches... but they didn\u0027t work in my real-world tests.)\u003C\/p\u003E\n\u003Cp\u003EEnter \u003Ca href=\u0022https:\/\/www.consentmanager.net\/en\/\u0022\u003E\u003Cstrong\u003Econsentmanager.net\u003C\/strong\u003E\u003C\/a\u003E\u003Cstrong\u003E. \u0026nbsp;\u003C\/strong\u003EThey are a paid service with a free tier, and they provide a contrib module for Drupal. \u0026nbsp;I was able to get it working quickly and easily, and they didn\u0027t even ask for a credit card. \u0026nbsp;This is definitely my preferred solution for commercial websites.\u003C\/p\u003E\n","summary":"More fraught than it should be"}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1741220425,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":78}],"uuid":[{"value":"3d24a77e-6afa-4c06-becd-9705e65fb548"}],"vid":[{"value":395}],"langcode":[{"value":"en"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-03-04T17:51:03+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Welcome Back"}],"created":[{"value":"2025-03-04T17:42:36+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-03-04T17:51:03+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/welcome-back","pid":112,"langcode":"en"}],"body":[{"value":"\u003Cp\u003EWelcome back! \u0026nbsp;The cobbler has finally fixed his own shoes.\u003C\/p\u003E\u003Cp\u003EI\u0027m referring of course to the \u0022cobbler\u0027s shoes\u0022 parable, about a cobbler who is so busy fixing other people\u0027s shoes (because that\u0027s his job), that he doesn\u0027t have any time for his own (or his children, as the parable goes).\u003C\/p\u003E\u003Cp\u003EMy own websites have been much the same over the past 10+ years, as I\u0027ve been engaged in professional web development. \u0026nbsp;If I spend all my day on a client\u0027s website, when am I to have time to do my own?\u003C\/p\u003E\u003Cp\u003EThe answer: I recently found myself between jobs, and took the opportunity to upgrade. \u0026nbsp;(Also, Drupal 7 has reached End of Life.)\u003C\/p\u003E\u003Cp\u003EThe new stack is much the same as the old stack. \u0026nbsp;I had to switch from Apache to Nginx, because I wanted to add TLS support, and it\u0027s much easier with Nginx. \u0026nbsp;(In fact, to make it work with Apache, you need to install Nginx anyway. \u0026nbsp;What\u0027s the point of having both?)\u003C\/p\u003E\u003Cp\u003EMaybe the biggest difference is I now push my code to Github, to take advantage of the excellent CI\/CD provided by Github Actions. \u0026nbsp;That, and DDEV instead of Lando in my local environment. \u0026nbsp;(DDEV does a better job of supporting headless Drupal. \u0026nbsp;Sorry, Lando, I hate to see you go.)\u003C\/p\u003E\u003Cp\u003ELong story short: here we are, with a LEMP stack instead of a LAMP stack. \u0026nbsp;Nginx has replaced Apache, MariaDB has replaced MySQL. \u0026nbsp;Ubuntu and PHP have both received major upgrades. \u0026nbsp;But I\u0027m still on Digital Ocean, still supporting half a dozen websites on the same tiny VPS I\u0027ve had all these years. \u0026nbsp;Drupal 11 still supports multisite.\u003C\/p\u003E\u003Cp\u003EThanks for visiting, I\u0027m glad you\u0027re here.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EWelcome back! \u0026nbsp;The cobbler has finally fixed his own shoes.\u003C\/p\u003E\n\u003Cp\u003EI\u0027m referring of course to the \u0022cobbler\u0027s shoes\u0022 parable, about a cobbler who is so busy fixing other people\u0027s shoes (because that\u0027s his job), that he doesn\u0027t have any time for his own (or his children, as the parable goes).\u003C\/p\u003E\n\u003Cp\u003EMy own websites have been much the same over the past 10+ years, as I\u0027ve been engaged in professional web development. \u0026nbsp;If I spend all my day on a client\u0027s website, when am I to have time to do my own?\u003C\/p\u003E\n\u003Cp\u003EThe answer: I recently found myself between jobs, and took the opportunity to upgrade. \u0026nbsp;(Also, Drupal 7 has reached End of Life.)\u003C\/p\u003E\n\u003Cp\u003EThe new stack is much the same as the old stack. \u0026nbsp;I had to switch from Apache to Nginx, because I wanted to add TLS support, and it\u0027s much easier with Nginx. \u0026nbsp;(In fact, to make it work with Apache, you need to install Nginx anyway. \u0026nbsp;What\u0027s the point of having both?)\u003C\/p\u003E\n\u003Cp\u003EMaybe the biggest difference is I now push my code to Github, to take advantage of the excellent CI\/CD provided by Github Actions. \u0026nbsp;That, and DDEV instead of Lando in my local environment. \u0026nbsp;(DDEV does a better job of supporting headless Drupal. \u0026nbsp;Sorry, Lando, I hate to see you go.)\u003C\/p\u003E\n\u003Cp\u003ELong story short: here we are, with a LEMP stack instead of a LAMP stack. \u0026nbsp;Nginx has replaced Apache, MariaDB has replaced MySQL. \u0026nbsp;Ubuntu and PHP have both received major upgrades. \u0026nbsp;But I\u0027m still on Digital Ocean, still supporting half a dozen websites on the same tiny VPS I\u0027ve had all these years. \u0026nbsp;Drupal 11 still supports multisite.\u003C\/p\u003E\n\u003Cp\u003EThanks for visiting, I\u0027m glad you\u0027re here.\u003C\/p\u003E\n","summary":"The cobbler has finally fixed his own shoes."}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1741110663,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":77}],"uuid":[{"value":"e45acc00-6d36-4eda-b342-48cc1707ef9e"}],"vid":[{"value":363}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2021-12-08T18:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"The Startup World is Just Fine"}],"created":[{"value":"2016-10-14T18:28:15+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2021-12-08T18:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/startup-world-just-fine","pid":111,"langcode":"und"}],"body":[{"value":"\u003Cdiv\u003EFuck my startup world? \u00a0Seriously? \u00a0Dude, chill out.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Ca href=\u0022https:\/\/medium.com\/startup-grind\/fuck-you-startup-world-ab6cc72fad0e\u0022\u003EIn an article on Medium\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/medium.com\/@shemag8\u0022\u003EShem\u003C\/a\u003E decries the evils he sees in the startup culture. \u00a0Not the evils of privileged white men making apps for privileged white men or failing to hire minorities or relying on contractors instead of employees or the evils of the \u0022sharing economy\u0022 in general. \u00a0Shem\u0027s problem seems to be with the kind of scotch they serve at these companies.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ETo be fair: Shem works at \u003Ca href=\u0022https:\/\/twitter.com\/myrollgallery\u0022\u003Eone of these companies\u003C\/a\u003E. \u00a0So I think his critique was meant somewhat tongue in cheek. \u00a0Also to be fair, I don\u0027t; I work at \u003Ca href=\u0022https:\/\/www.exygy.com\/\u0022\u003Ea certified B corporation\u003C\/a\u003E that is \u003Ca href=\u0022https:\/\/www.exygy.com\/latest-work\u0022\u003Eactually trying to save the world\u003C\/a\u003E. \u00a0But I have worked at my share of startups and I\u0027ve experienced firsthand all the things Shem is criticizing. \u00a0Putting aside the fact that he is criticizing the wrong things, he\u0027s still wrong. \u00a0Here\u0027s why.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your startup scene with your 30 minute morning routines of reading TechCrunch\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EWhat\u0027s wrong with being plugged into an industry? \u00a0Wallstreet bankers read the WSJ every day. \u00a0People in Hollywood read Entertainment Weekly or whatever the hell passes for news down there. \u00a0Being informed about your industry isn\u0027t a bad thing.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your crazy work hours.\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ENo. \u00a0Stop it. \u00a0You\u0027re wrong. \u00a0If you don\u0027t want to work crazy hours, don\u0027t work at a startup. \u00a0Yes, it\u0027s crazy that Elon Musk works 100 hour weeks. \u00a0No, you don\u0027t have to do that. \u00a0Unless you want to be as successful as he is. \u00a0You don\u0027t? \u00a0That\u0027s fine too; neither do I. \u00a0I\u0027d prefer to have a wife and kids, but that\u0027s my choice.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EThere\u0027s a larger truth here: a career choice is really a lifestyle choice. \u00a0Some people prefer to work 40 hours a week and have families and spend time with them. \u00a0Some people choose to work 100 hours a week and become billionaires. \u00a0The real question is to decide what\u0027s important, and then go get it. \u00a0Don\u0027t listen to anyone who tells you you\u0027re wrong.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your drinking culture\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EWhat the hell is wrong with drinking? \u00a0I didn\u0027t learn to drink in tech; I learned to drink in my past life as an attorney. \u00a0All attorneys drink. \u00a0A lot better than these techie nerds. \u00a0(Yes, there is such a thing as \u0022better,\u0022 and no, you don\u0027t have it.) \u00a0Alcohol is a chemical depressent that is used by a lot of people to alleviate the effects of stress. \u00a0I\u0027m not saying self-medicating is a good thing, but it\u0027s certainly not unique to the tech culture. \u00a0No, I\u0027m not going to switch jobs just because you have Glenlivet 17. \u00a0But yes, it is an attractive perk. \u00a0(We\u0027re going to rant more about perks in a minute.)\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your eating disorders\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EOh, shut up. \u00a0Now you\u0027re just reaching. \u00a0You can\u0027t simultaneously criticize someone for eating too much and also not eating enough. \u00a0Yes, Soylent sounds terrible. \u00a0I don\u0027t know anyone who actually does that. \u00a0At my job, the company caters a team lunch once a week. \u00a0At my last job, it was every day. \u00a0It was actually a great chance to take a break from your work, sample a delicious meal cooked by a local restaurant (a hell of a lot better than that PB\u0026amp;J you\u0027re packing), and bond with my coworkers. \u00a0It\u0027s also smart from the company\u0027s perspective. \u00a0At a previous job that didn\u0027t cater, employees often left the office to have 2 hour lunches. \u00a0If the food is right there, you\u0027re back to work much faster. \u00a0Which, if you\u0027re passionate about what you do, is a good thing.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EIncidentally, I now work in the Mission District, the world leader for delicious burritos. \u00a0At this point I\u0027ve had most of them.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EAnd fuck all those parties\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EThis is related to the drinking thing. \u00a0If you\u0027re working at a startup, you\u0027ll probably be unemployed in 6 months, in spite of the fact that you\u0027re working your ass off every day. \u00a0You\u0027re working way harder than you otherwise would, at something you really believe in. \u00a0I\u0027ve seen people lose relationships over this stuff. \u00a0(Again, I wouldn\u0027t make that choice, but I understand why some people would.) \u00a0That\u0027s really stressful. \u00a0If you don\u0027t kick back every once in a while, you\u0027re going to burn out, which isn\u0027t good for anyone. \u00a0Another round of funding means your company can keep going for another 6 months. \u00a0That is worth celebrating.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your open space floor plans\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EYou don\u0027t know what the fuck you\u0027re talking about. \u00a0Have you ever worked in a cubicle? \u00a0I have. \u00a0It\u0027s awful. \u00a0Go try it and then tell me how much you hate open floor plans.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck reading a book a week. No one can read that fast.\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ENow you just sound embarassed. \u00a0OK, maybe you\u0027re not a very good reader. \u00a0That\u0027s ok, I understand. \u00a0Not everybody is. \u00a0Nothing to be ashamed of. \u00a0But you\u0027re just embarassing yourself if you claim it\u0027s impossible to get through 300 pages in 7 days. \u00a0In law school, I did that in \u003Cem\u003Eone\u003C\/em\u003E day. \u00a0Fine, we\u0027re not talking about lawyers, but techies are pretty smart too.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck \u201centrepreneurs\u201d\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ENo, there is a difference between being an entrepreneur and being unemployed. \u00a0I\u0027ve done both. \u00a0Yes, \u0022entrepreneur\u0022 is overused and overrated. \u00a0If anyone ever introduced themselves to me as \u0022Hi, I\u0027m an entrepreneur,\u0022 I would walk away from them immediately.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EBut, I live in the Bay Area. \u00a0There are more startups here per capita than anywhere in the world. \u00a0This is quite literally where dreams are made. \u00a0I know more than my fair share of people who are chasing some crazy idea that might just work. \u00a0I know one or two who actually succeeded at it.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EAlso? \u00a0It\u0027s 2016. \u00a0For people entering the workforce now, the economy has failed us. \u00a0Yes, the economy is recovering, but it\u0027s never going to be what it was. \u00a0The Dow may be up and unemployment may be down and the GDP may be climbing slowly, but employers no longer have the same attitudes toward their employees that they once did. \u00a0Nobody stays at the same job for 30 years any more, and if they did, their boss wouldn\u0027t give them a Rolex for it. \u00a0Especially in the legal industry, the jobs that used to exist simply don\u0027t any more. \u00a0So, more and more of my friends are striking out on their own and helping themselves because the traditional economy won\u0027t help them.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EAnd by the way? \u00a0Some pretty awesome stuff has come out of garages. \u00a0I don\u0027t even need to mention Apple because you already know.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck you productivity freaks\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EIf you woke up at 6am, good for you. \u00a0Most of my coworkers aren\u0027t in the office until 10am - but they all stay later than me. \u00a0(I keep more normal hours because I want to join my kids for dinner.) \u00a0If someone else woke up at 4:30am, good for them. \u00a0Don\u0027t feel bad, you\u0027re still doing a good job. \u00a0You don\u0027t need to resent them for it.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck you and your stupid interview questions\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EIf you can\u0027t do well in an interview, go find yourself a more traditional job. \u00a0If you\u0027re smart enough to work at a startup, you\u0027re smart enough to work at a traditional company too. \u00a0Startups are looking for employees that are creative and original thinkers. \u00a0These questions are designed to test that.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EYou should also remember that every interview is two-way. \u00a0If you don\u0027t like the interview questions, that\u0027s a sign you might not like working for that company either.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your fucking jargon and acronyms\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EBecause, like, other industries don\u0027t have acronyms? \u00a0Try doing something else for a while. \u00a0Anything. \u00a0Tell me it doesn\u0027t have acronyms.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck the transparency trend, the post mortem and the 5 whys\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ESo you\u0027re the Harvard Business Journal now? \u00a0You think because you\u0027ve worked at 1-2 startups that you have insight into what\u0027s a good business practice and what\u0027s not? \u00a0Seriously, you\u0027re going to criticize A\/B testing? \u00a0Are metrics evil too? \u00a0I know you don\u0027t like it when a website changes. \u00a0But I need to tell you a Truth, son. \u00a0Change is part of life. \u00a0You\u0027re going to have to learn to accept that the login button is on the other side of the menu now. \u00a0There there, it\u0027s ok.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck the ridiculous incentives that you give\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EI\u0027ve actually talked about this before, but I forgive you for not being a regular reader of my blog. \u00a0Tech companies have to fight very hard for good talent, even if you\u0027re Apple or Facebook. \u00a0Nobody switches jobs for a ping pong table (although yes, I will absolutely play on the table if you have one). \u00a0Techies pick a job based on what they think will give them the most satisfaction and fulfillment. \u00a0It\u0027s about the work you let them do. \u00a0Still, once you\u0027ve attracted that awesome talent, you need to hold on to it. \u00a0That\u0027s where the snacks and the ping pong tables and the Glenlivet 17 come in. \u00a0It\u0027s also about morale. \u00a0I worked at a startup that had video game machines in the break room. \u00a0When I got frustrated with my work, I\u0027d go slay some zombies for 15 minutes then go back to work with a clear head. \u00a0These things aren\u0027t ridiculous; they\u0027re carefully designed to retain talent and make them happy.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ESo, why don\u0027t other industries do this? \u00a0Two reasons: (1) This is a new industry that has the chance to do things from scratch, and (2) Other industries don\u0027t have to compete so hard for workers. \u00a0That\u0027s not completely true, but if you look at other industries where workers are in very high demand, they are also highly paid and often get cool perks too.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EDon\u0027t knock the unlimited vacation policy either. \u00a0Yes, I know I\u0027ll end up taking less vacation as a result. \u00a0Everyone knows it. \u00a0But I love not having to track my accrued PTO. \u00a0I love being able to say \u0022I need to take a day off for the Jewish High Holidays\u0022 without worrying about whether I\u0027ve earned that much time off after 6 months. \u00a0My wife has to bid on her days off; even if she\u0027s earned the time, she might not be allowed to use it. \u00a0Even worse, most companies have a maximum limit to accrued PTO, which means after a certain point, you\u0027re no longer earning it. \u00a0That\u0027s . . . obscene. \u00a0\u0022Unlimited vacation time\u0022 means you don\u0027t have to worry about the difference between sick days and PTO, or accrual, or any of that bullshit. \u00a0Just do what makes sense to you and to your team.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003Efuck you for making me one of you\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EYeah, we know you\u0027re one of us. \u00a0It\u0027s ok. \u00a0It\u0027s a fun ride, you may as well enjoy it.\u003C\/div\u003E","format":"full_html","processed":"\u003Cdiv\u003EFuck my startup world? \u0026nbsp;Seriously? \u0026nbsp;Dude, chill out.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Ca href=\u0022https:\/\/medium.com\/startup-grind\/fuck-you-startup-world-ab6cc72fad0e\u0022\u003EIn an article on Medium\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/medium.com\/@shemag8\u0022\u003EShem\u003C\/a\u003E decries the evils he sees in the startup culture. \u0026nbsp;Not the evils of privileged white men making apps for privileged white men or failing to hire minorities or relying on contractors instead of employees or the evils of the \u0022sharing economy\u0022 in general. \u0026nbsp;Shem\u0027s problem seems to be with the kind of scotch they serve at these companies.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ETo be fair: Shem works at \u003Ca href=\u0022https:\/\/twitter.com\/myrollgallery\u0022\u003Eone of these companies\u003C\/a\u003E. \u0026nbsp;So I think his critique was meant somewhat tongue in cheek. \u0026nbsp;Also to be fair, I don\u0027t; I work at \u003Ca href=\u0022https:\/\/www.exygy.com\/\u0022\u003Ea certified B corporation\u003C\/a\u003E that is \u003Ca href=\u0022https:\/\/www.exygy.com\/latest-work\u0022\u003Eactually trying to save the world\u003C\/a\u003E. \u0026nbsp;But I have worked at my share of startups and I\u0027ve experienced firsthand all the things Shem is criticizing. \u0026nbsp;Putting aside the fact that he is criticizing the wrong things, he\u0027s still wrong. \u0026nbsp;Here\u0027s why.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your startup scene with your 30 minute morning routines of reading TechCrunch\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EWhat\u0027s wrong with being plugged into an industry? \u0026nbsp;Wallstreet bankers read the WSJ every day. \u0026nbsp;People in Hollywood read Entertainment Weekly or whatever the hell passes for news down there. \u0026nbsp;Being informed about your industry isn\u0027t a bad thing.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your crazy work hours.\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ENo. \u0026nbsp;Stop it. \u0026nbsp;You\u0027re wrong. \u0026nbsp;If you don\u0027t want to work crazy hours, don\u0027t work at a startup. \u0026nbsp;Yes, it\u0027s crazy that Elon Musk works 100 hour weeks. \u0026nbsp;No, you don\u0027t have to do that. \u0026nbsp;Unless you want to be as successful as he is. \u0026nbsp;You don\u0027t? \u0026nbsp;That\u0027s fine too; neither do I. \u0026nbsp;I\u0027d prefer to have a wife and kids, but that\u0027s my choice.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EThere\u0027s a larger truth here: a career choice is really a lifestyle choice. \u0026nbsp;Some people prefer to work 40 hours a week and have families and spend time with them. \u0026nbsp;Some people choose to work 100 hours a week and become billionaires. \u0026nbsp;The real question is to decide what\u0027s important, and then go get it. \u0026nbsp;Don\u0027t listen to anyone who tells you you\u0027re wrong.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your drinking culture\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EWhat the hell is wrong with drinking? \u0026nbsp;I didn\u0027t learn to drink in tech; I learned to drink in my past life as an attorney. \u0026nbsp;All attorneys drink. \u0026nbsp;A lot better than these techie nerds. \u0026nbsp;(Yes, there is such a thing as \u0022better,\u0022 and no, you don\u0027t have it.) \u0026nbsp;Alcohol is a chemical depressent that is used by a lot of people to alleviate the effects of stress. \u0026nbsp;I\u0027m not saying self-medicating is a good thing, but it\u0027s certainly not unique to the tech culture. \u0026nbsp;No, I\u0027m not going to switch jobs just because you have Glenlivet 17. \u0026nbsp;But yes, it is an attractive perk. \u0026nbsp;(We\u0027re going to rant more about perks in a minute.)\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your eating disorders\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EOh, shut up. \u0026nbsp;Now you\u0027re just reaching. \u0026nbsp;You can\u0027t simultaneously criticize someone for eating too much and also not eating enough. \u0026nbsp;Yes, Soylent sounds terrible. \u0026nbsp;I don\u0027t know anyone who actually does that. \u0026nbsp;At my job, the company caters a team lunch once a week. \u0026nbsp;At my last job, it was every day. \u0026nbsp;It was actually a great chance to take a break from your work, sample a delicious meal cooked by a local restaurant (a hell of a lot better than that PB\u0026amp;J you\u0027re packing), and bond with my coworkers. \u0026nbsp;It\u0027s also smart from the company\u0027s perspective. \u0026nbsp;At a previous job that didn\u0027t cater, employees often left the office to have 2 hour lunches. \u0026nbsp;If the food is right there, you\u0027re back to work much faster. \u0026nbsp;Which, if you\u0027re passionate about what you do, is a good thing.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EIncidentally, I now work in the Mission District, the world leader for delicious burritos. \u0026nbsp;At this point I\u0027ve had most of them.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EAnd fuck all those parties\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EThis is related to the drinking thing. \u0026nbsp;If you\u0027re working at a startup, you\u0027ll probably be unemployed in 6 months, in spite of the fact that you\u0027re working your ass off every day. \u0026nbsp;You\u0027re working way harder than you otherwise would, at something you really believe in. \u0026nbsp;I\u0027ve seen people lose relationships over this stuff. \u0026nbsp;(Again, I wouldn\u0027t make that choice, but I understand why some people would.) \u0026nbsp;That\u0027s really stressful. \u0026nbsp;If you don\u0027t kick back every once in a while, you\u0027re going to burn out, which isn\u0027t good for anyone. \u0026nbsp;Another round of funding means your company can keep going for another 6 months. \u0026nbsp;That is worth celebrating.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your open space floor plans\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EYou don\u0027t know what the fuck you\u0027re talking about. \u0026nbsp;Have you ever worked in a cubicle? \u0026nbsp;I have. \u0026nbsp;It\u0027s awful. \u0026nbsp;Go try it and then tell me how much you hate open floor plans.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck reading a book a week. No one can read that fast.\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ENow you just sound embarassed. \u0026nbsp;OK, maybe you\u0027re not a very good reader. \u0026nbsp;That\u0027s ok, I understand. \u0026nbsp;Not everybody is. \u0026nbsp;Nothing to be ashamed of. \u0026nbsp;But you\u0027re just embarassing yourself if you claim it\u0027s impossible to get through 300 pages in 7 days. \u0026nbsp;In law school, I did that in \u003Cem\u003Eone\u003C\/em\u003E day. \u0026nbsp;Fine, we\u0027re not talking about lawyers, but techies are pretty smart too.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck \u201centrepreneurs\u201d\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ENo, there is a difference between being an entrepreneur and being unemployed. \u0026nbsp;I\u0027ve done both. \u0026nbsp;Yes, \u0022entrepreneur\u0022 is overused and overrated. \u0026nbsp;If anyone ever introduced themselves to me as \u0022Hi, I\u0027m an entrepreneur,\u0022 I would walk away from them immediately.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EBut, I live in the Bay Area. \u0026nbsp;There are more startups here per capita than anywhere in the world. \u0026nbsp;This is quite literally where dreams are made. \u0026nbsp;I know more than my fair share of people who are chasing some crazy idea that might just work. \u0026nbsp;I know one or two who actually succeeded at it.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EAlso? \u0026nbsp;It\u0027s 2016. \u0026nbsp;For people entering the workforce now, the economy has failed us. \u0026nbsp;Yes, the economy is recovering, but it\u0027s never going to be what it was. \u0026nbsp;The Dow may be up and unemployment may be down and the GDP may be climbing slowly, but employers no longer have the same attitudes toward their employees that they once did. \u0026nbsp;Nobody stays at the same job for 30 years any more, and if they did, their boss wouldn\u0027t give them a Rolex for it. \u0026nbsp;Especially in the legal industry, the jobs that used to exist simply don\u0027t any more. \u0026nbsp;So, more and more of my friends are striking out on their own and helping themselves because the traditional economy won\u0027t help them.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EAnd by the way? \u0026nbsp;Some pretty awesome stuff has come out of garages. \u0026nbsp;I don\u0027t even need to mention Apple because you already know.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck you productivity freaks\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EIf you woke up at 6am, good for you. \u0026nbsp;Most of my coworkers aren\u0027t in the office until 10am - but they all stay later than me. \u0026nbsp;(I keep more normal hours because I want to join my kids for dinner.) \u0026nbsp;If someone else woke up at 4:30am, good for them. \u0026nbsp;Don\u0027t feel bad, you\u0027re still doing a good job. \u0026nbsp;You don\u0027t need to resent them for it.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck you and your stupid interview questions\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EIf you can\u0027t do well in an interview, go find yourself a more traditional job. \u0026nbsp;If you\u0027re smart enough to work at a startup, you\u0027re smart enough to work at a traditional company too. \u0026nbsp;Startups are looking for employees that are creative and original thinkers. \u0026nbsp;These questions are designed to test that.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EYou should also remember that every interview is two-way. \u0026nbsp;If you don\u0027t like the interview questions, that\u0027s a sign you might not like working for that company either.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck your fucking jargon and acronyms\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EBecause, like, other industries don\u0027t have acronyms? \u0026nbsp;Try doing something else for a while. \u0026nbsp;Anything. \u0026nbsp;Tell me it doesn\u0027t have acronyms.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck the transparency trend, the post mortem and the 5 whys\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ESo you\u0027re the Harvard Business Journal now? \u0026nbsp;You think because you\u0027ve worked at 1-2 startups that you have insight into what\u0027s a good business practice and what\u0027s not? \u0026nbsp;Seriously, you\u0027re going to criticize A\/B testing? \u0026nbsp;Are metrics evil too? \u0026nbsp;I know you don\u0027t like it when a website changes. \u0026nbsp;But I need to tell you a Truth, son. \u0026nbsp;Change is part of life. \u0026nbsp;You\u0027re going to have to learn to accept that the login button is on the other side of the menu now. \u0026nbsp;There there, it\u0027s ok.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003EFuck the ridiculous incentives that you give\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EI\u0027ve actually talked about this before, but I forgive you for not being a regular reader of my blog. \u0026nbsp;Tech companies have to fight very hard for good talent, even if you\u0027re Apple or Facebook. \u0026nbsp;Nobody switches jobs for a ping pong table (although yes, I will absolutely play on the table if you have one). \u0026nbsp;Techies pick a job based on what they think will give them the most satisfaction and fulfillment. \u0026nbsp;It\u0027s about the work you let them do. \u0026nbsp;Still, once you\u0027ve attracted that awesome talent, you need to hold on to it. \u0026nbsp;That\u0027s where the snacks and the ping pong tables and the Glenlivet 17 come in. \u0026nbsp;It\u0027s also about morale. \u0026nbsp;I worked at a startup that had video game machines in the break room. \u0026nbsp;When I got frustrated with my work, I\u0027d go slay some zombies for 15 minutes then go back to work with a clear head. \u0026nbsp;These things aren\u0027t ridiculous; they\u0027re carefully designed to retain talent and make them happy.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ESo, why don\u0027t other industries do this? \u0026nbsp;Two reasons: (1) This is a new industry that has the chance to do things from scratch, and (2) Other industries don\u0027t have to compete so hard for workers. \u0026nbsp;That\u0027s not completely true, but if you look at other industries where workers are in very high demand, they are also highly paid and often get cool perks too.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EDon\u0027t knock the unlimited vacation policy either. \u0026nbsp;Yes, I know I\u0027ll end up taking less vacation as a result. \u0026nbsp;Everyone knows it. \u0026nbsp;But I love not having to track my accrued PTO. \u0026nbsp;I love being able to say \u0022I need to take a day off for the Jewish High Holidays\u0022 without worrying about whether I\u0027ve earned that much time off after 6 months. \u0026nbsp;My wife has to bid on her days off; even if she\u0027s earned the time, she might not be allowed to use it. \u0026nbsp;Even worse, most companies have a maximum limit to accrued PTO, which means after a certain point, you\u0027re no longer earning it. \u0026nbsp;That\u0027s . . . obscene. \u0026nbsp;\u0022Unlimited vacation time\u0022 means you don\u0027t have to worry about the difference between sick days and PTO, or accrual, or any of that bullshit. \u0026nbsp;Just do what makes sense to you and to your team.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cstrong\u003E\u003Cem\u003Efuck you for making me one of you\u003C\/em\u003E\u003C\/strong\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EYeah, we know you\u0027re one of us. \u0026nbsp;It\u0027s ok. \u0026nbsp;It\u0027s a fun ride, you may as well enjoy it.\u003C\/div\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1638986402,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":76}],"uuid":[{"value":"e794e154-ca25-43ba-952c-49b8747e4aec"}],"vid":[{"value":390}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2024-02-29T22:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Do You Wanna Build a Startup?"}],"created":[{"value":"2016-10-10T19:46:13+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-02-29T22:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/do-you-wanna-build-startup","pid":110,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ESomehow, I keep having this conversation with friends \u0026amp; acquaintances. \u00a0Maybe it\u0027s because I\u0027ve been through several (failed) startups myself. \u00a0Maybe it\u0027s simply because I live in San Francisco and everyone here dreams about their brilliant idea that\u0027s going to make them a million dollars.\u003C\/p\u003E\u003Cp\u003EI like to throw cold water on those ideas, not because I\u0027m a curmudgeon (although I am), or because I know better (although I do). \u00a0I do it for one simple reason:\u00a0\u003Cstrong\u003Eyou need to identify your impediments if you want to succeed.\u003C\/strong\u003E \u00a0If your brilliant idea requires an ingredient that you don\u0027t have, you need to realize that, and then go get it.\u003C\/p\u003E\u003Cp\u003EBut it turns out I\u0027m not the first person to think about such things. \u00a0In fact, there\u0027s a well-respected trio of essays from famous people in Silicon Valley who have written at length about exactly what it takes to succeed here. \u00a0I\u0027m sharing these here, for the next time someone tells me about their Big Idea:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/paulgraham.com\/start.html\u0022\u003EPaul Graham: \u201cHow to Start a Startup\u201d\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022http:\/\/web.stanford.edu\/group\/e145\/cgi-bin\/winter\/drupal\/upload\/handouts\/Four_Steps.pdf\u0022\u003ESteven Blank:\u00a0\u201cThe Four Steps to the Epiphany\u201d \u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/theleanstartup.com\/\u0022\u003EEric Ries:\u00a0\u201cThe Lean Startup\u201d\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003EBonus: \u003Ca href=\u0022https:\/\/www.newyorker.com\/magazine\/2016\/10\/10\/sam-altmans-manifest-destiny\u0022\u003ESam Altman: \u0022Manifest Destiny\u0022\u003C\/a\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EIf you\u0027re nursing a Big Idea, consider this your first test: Are you willing to invest in the time it takes to read a few articles about how to succeed at what you\u0027re trying to do, written by people who know what they\u0027re talking about? \u00a0If the answer is \u0022yes,\u0022 then you\u0027re on the right track.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ESomehow, I keep having this conversation with friends \u0026amp; acquaintances. \u0026nbsp;Maybe it\u0027s because I\u0027ve been through several (failed) startups myself. \u0026nbsp;Maybe it\u0027s simply because I live in San Francisco and everyone here dreams about their brilliant idea that\u0027s going to make them a million dollars.\u003C\/p\u003E\n\u003Cp\u003EI like to throw cold water on those ideas, not because I\u0027m a curmudgeon (although I am), or because I know better (although I do). \u0026nbsp;I do it for one simple reason:\u0026nbsp;\u003Cstrong\u003Eyou need to identify your impediments if you want to succeed.\u003C\/strong\u003E \u0026nbsp;If your brilliant idea requires an ingredient that you don\u0027t have, you need to realize that, and then go get it.\u003C\/p\u003E\n\u003Cp\u003EBut it turns out I\u0027m not the first person to think about such things. \u0026nbsp;In fact, there\u0027s a well-respected trio of essays from famous people in Silicon Valley who have written at length about exactly what it takes to succeed here. \u0026nbsp;I\u0027m sharing these here, for the next time someone tells me about their Big Idea:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/paulgraham.com\/start.html\u0022\u003EPaul Graham: \u201cHow to Start a Startup\u201d\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022http:\/\/web.stanford.edu\/group\/e145\/cgi-bin\/winter\/drupal\/upload\/handouts\/Four_Steps.pdf\u0022\u003ESteven Blank:\u0026nbsp;\u201cThe Four Steps to the Epiphany\u201d \u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/theleanstartup.com\/\u0022\u003EEric Ries:\u0026nbsp;\u201cThe Lean Startup\u201d\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003EBonus: \u003Ca href=\u0022https:\/\/www.newyorker.com\/magazine\/2016\/10\/10\/sam-altmans-manifest-destiny\u0022\u003ESam Altman: \u0022Manifest Destiny\u0022\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EIf you\u0027re nursing a Big Idea, consider this your first test: Are you willing to invest in the time it takes to read a few articles about how to succeed at what you\u0027re trying to do, written by people who know what they\u0027re talking about? \u0026nbsp;If the answer is \u0022yes,\u0022 then you\u0027re on the right track.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1709244002,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":72}],"uuid":[{"value":"af57ce7f-30ca-4e65-9782-be547f7a64e5"}],"vid":[{"value":251}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T22:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Why I Love Programming"}],"created":[{"value":"2015-09-29T05:05:50+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T22:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/why-i-love-programming","pid":106,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EOn the heels of two posts on \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/thoughts-change\u0022\u003Ewhere I\u0027m working\u003C\/a\u003E and \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/why-mac-better\u0022\u003Ethe tools I\u0027m using\u003C\/a\u003E, I wanted to share some more general thoughts on why I love my job so much. \u00a0The perks and the pay certainly don\u0027t hurt, but honestly, if they didn\u0027t pay me, I would do this for free.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EAlong these lines, I wanted to share the following Quora posts on why people stick with programming when so many other people burn out on their careers:\u003C\/p\u003E\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35\/answer\/Xavier-Amatriain\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Xavier-Amatriain\u0022\u003EXavier Amatriain\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35#ans12770069\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35\u0022 ref=\u0022canonical\u0022\u003EWhat do people in Silicon Valley plan to do once they are over 35?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022Do-people-lose-interest-in-programming-as-they-age\/answer\/Tim-Daly\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Tim-Daly\u0022\u003ETim Daly\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/Do-people-lose-interest-in-programming-as-they-age#ans666090\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/Do-people-lose-interest-in-programming-as-they-age\u0022 ref=\u0022canonical\u0022\u003EDo people lose interest in programming as they age?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003EAnd finally, what makes a good programmer?\u003C\/p\u003E\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Michael-O-Church\u0022\u003EMichael O. Church\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not#ans7272267\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\u0022 ref=\u0022canonical\u0022\u003EWhat do the top 1% of software engineers do that the other 99% do not?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003EMy own editorial: I do it because it\u0027s fun. \u00a0I love building things that other people can use. \u00a0I love it when the thing I build is aesthetically beautiful and also makes someone\u0027s life better in some small way. \u00a0The law was a very left-brain profession, and web design and development let me flex both my left brain and my right. \u00a0The field is constantly changing and there\u0027s always something new to learn. \u00a0It\u0027s a hot new industry filled with young, energetic people and lots of perks. \u00a0It\u0027s new and innovative and we have no idea what it will look like in 5 years.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003EI love being part of that.\u003C\/span\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EOn the heels of two posts on \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/thoughts-change\u0022\u003Ewhere I\u0027m working\u003C\/a\u003E and \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/why-mac-better\u0022\u003Ethe tools I\u0027m using\u003C\/a\u003E, I wanted to share some more general thoughts on why I love my job so much. \u0026nbsp;The perks and the pay certainly don\u0027t hurt, but honestly, if they didn\u0027t pay me, I would do this for free.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EAlong these lines, I wanted to share the following Quora posts on why people stick with programming when so many other people burn out on their careers:\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35\/answer\/Xavier-Amatriain\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Xavier-Amatriain\u0022\u003EXavier Amatriain\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35#ans12770069\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/What-do-people-in-Silicon-Valley-plan-to-do-once-they-are-over-35\u0022 ref=\u0022canonical\u0022\u003EWhat do people in Silicon Valley plan to do once they are over 35?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022Do-people-lose-interest-in-programming-as-they-age\/answer\/Tim-Daly\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Tim-Daly\u0022\u003ETim Daly\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/Do-people-lose-interest-in-programming-as-they-age#ans666090\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/Do-people-lose-interest-in-programming-as-they-age\u0022 ref=\u0022canonical\u0022\u003EDo people lose interest in programming as they age?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003EAnd finally, what makes a good programmer?\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003ERead \u003Ca href=\u0022https:\/\/www.quora.com\/profile\/Michael-O-Church\u0022\u003EMichael O. Church\u003C\/a\u003E\u0027s \u003Ca href=\u0022\/What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not#ans7272267\u0022\u003Eanswer\u003C\/a\u003E to \u003Ca href=\u0022\/What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\u0022 ref=\u0022canonical\u0022\u003EWhat do the top 1% of software engineers do that the other 99% do not?\u003C\/a\u003E on \u003Ca href=\u0022https:\/\/www.__nousername__.main.quora.com\u0022\u003EQuora\u003C\/a\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003EMy own editorial: I do it because it\u0027s fun. \u0026nbsp;I love building things that other people can use. \u0026nbsp;I love it when the thing I build is aesthetically beautiful and also makes someone\u0027s life better in some small way. \u0026nbsp;The law was a very left-brain profession, and web design and development let me flex both my left brain and my right. \u0026nbsp;The field is constantly changing and there\u0027s always something new to learn. \u0026nbsp;It\u0027s a hot new industry filled with young, energetic people and lots of perks. \u0026nbsp;It\u0027s new and innovative and we have no idea what it will look like in 5 years.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan class=\u0022quora-content-embed\u0022 data-name=\u0022What-do-the-top-1-of-software-engineers-do-that-the-other-99-do-not\/answer\/Michael-O-Church\u0022\u003EI love being part of that.\u003C\/span\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1537221601,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":71}],"uuid":[{"value":"89bd3585-9730-4bf4-b62b-b36b43a46a2a"}],"vid":[{"value":335}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-05-28T08:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Thoughts on Change"}],"created":[{"value":"2015-09-29T04:57:07+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-05-28T08:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/thoughts-change","pid":105,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI quit.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EThis is the first time I\u0027ve announced it publicly. \u00a0Two weeks ago, I was offered a job by \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, and I accepted. \u00a0That means I\u0027m leaving San Francisco International Airport after more than two years of service. \u00a0I\u0027d like to share some thoughts on why.\u003C\/p\u003E\u003Cp\u003EFirst: My intent is to keep this positive. \u00a0I could get into personality conflicts or politics, and those things did matter, but that\u0027s not a very interesting article, and certainly doesn\u0027t belong in the public sphere.\u003C\/p\u003E\u003Cp\u003EAlso: It\u0027s worth noting that there is a lot of good at the airport. \u00a0There are some smart, talented, hard working people. \u00a0I made some friends that I will honestly miss. \u00a0But that\u0027s not what this article is about either. \u00a0My point is that the airport does offer a good value proposition. \u00a0The pay was excellent. \u00a0The benefits (health, vision, dental, retirement) were unbeatable. \u00a0I was earning a pension. \u00a0I was there for over two years - by far the longest I\u0027ve ever stayed at one company. \u00a0Most of the time, I did interesting things in a cool setting. \u00a0I got to watch 747\u0027s go by my window all day.\u003C\/p\u003E\u003Cp\u003EThe value proposition is what this article is really about. \u00a0I\u0027m a web developer, and I\u0027m in the unique position of being able to choose where I work. \u00a0This is a rare luxury, and one I did not enjoy as an attorney. \u00a0My ability to do this is based in part on my life choices and some hard work, but it\u0027s also based on an insane amount of luck. \u00a0I\u0027m very grateful, and I thank God every day. \u00a0\u003Ca href=\u0022https:\/\/www.quora.com\/Do-people-lose-interest-in-programming-as-they-age-Is-it-accurate-to-expect-that-older-programmers-are-slower-make-more-mistakes-and-would-rather-be-doing-something-else-such-as-managing-programmers\u0022\u003EI really love what I do\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EAfter a certain point, your career choice is really a lifestyle choice. \u00a0Do you want to be an investment banker and earn a million dollars before you turn 24, and spend 80 hours at the office, and have no family and few friends? \u00a0Do you want to live alone, work at a minimum wage job, and spend all your free time playing video games and getting high? \u00a0Do you want to work at a stable government job with no prospect of upward mobility for 30 years? \u00a0Do you want to be a stay at home parent? \u00a0Do you want a job that offers \u0022work life\u0022 balance so you can work AND have time to raise a family? \u00a0Do you want to sell your soul and make millions for an evil corporation? \u00a0Do you want to work for a non-profit and make peanuts but be proud of what you do? \u00a0Do you want to be a firefighter and risk your life every day? \u00a0Do you want to work in the medical profession and save lives every day? \u00a0Do you want to travel? \u00a0Do you want to sit in front of a computer 8 hours a day? \u00a0Or 12 hours a day?\u003C\/p\u003E\u003Cp\u003EMaybe that\u0027s why Americans ask each other \u0022what do you do,\u0022 when what they really mean is \u0022how do you earn money?\u0022 \u00a0Because how we choose to earn our money really is a lifestyle choice.\u003C\/p\u003E\u003Cp\u003EWhen I decided to leave the airport, I had choices. \u00a0Do I want to commute for two hours in a car every day? \u00a0How about a private bus that will take me down the peninsula? \u00a0How about a company with no office, and I\u0027ll only see my coworkers over skype? \u00a0How about an office downtown San Francisco that requires me to ride public transit every day? \u00a0Some people hate public transit. \u00a0I love it.\u003C\/p\u003E\u003Cp\u003EIn addition, because the competition for developers is so high, it\u0027s safe to assume that a job will come with perks. \u00a0Here are some of the perks I\u0027ve heard about:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.quora.com\/What-is-the-lowest-salary-at-Google\u0022\u003EPeer bonuses\u00a0\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EFree food.\u003C\/strong\u003E\u00a0\u00a0The airport didn\u0027t have it, Pantheon does. \u00a0Offering food (or at least snacks)\u00a0belies a more generalized attitude that the company has toward its employees. \u00a0The airport\u0027s attitude was \u0022we don\u0027t care,\u0022 or \u0022we don\u0027t think it\u0027s a good use of our money.\u0022 \u00a0Pantheon\u0027s attitude is \u0022we want you to be taken care of.\u0022 \u00a0Of course I can choose to go buy my own meal whenever I want, and I certainly have enough money to do so. \u00a0I also have friends downtown and will be surrounded by awesome restaurants and food trucks so yes, I\u0027m sure I will eat out sometimes. \u00a0But I love knowing that my employer wants to take care of that for me. \u00a0And to be honest, that benefit adds up to several thousand dollars per year.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EHowever, for most developers,\u00a0\u003Cstrong\u003Eit\u0027s not really about the perks.\u003C\/strong\u003E \u00a0It wasn\u0027t for me. \u00a0Nobody is going to match the health \u0026amp; retirement benefits I had at the airport, to say nothing of the pension, and it will probably be years before I\u0027m earning that much again (at least on paper). \u00a0Of course, money matters. \u00a0I have children to feed and a mortgage. \u00a0But assuming I can get a decent salary, there are more important things:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EStandardized languages, platforms and rules (so it\u0027s not utter chaos) - here\u0027s a great Quora post on \u003Ca href=\u0022https:\/\/www.quora.com\/Why-did-Google-go-with-Java-instead-of-Haskell-Why-are-they-pushing-for-Go-instead-of-using-Haskell-or-Idris-now\u0022\u003Ehow Google does it\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003ELocation:\u00a0There\u0027s a reason Silicon Valley is the center of the tech world. \u00a0This is an awesome place to live! \u00a0In particular, I decided I wanted to work in San Francisco. \u00a0Not Palo Alto, not Emeryville, definitely not Walnut Creek. \u00a0A big part of that is because I\u00a0live in San Francisco, but it\u0027s also because I don\u0027t want to drive and I don\u0027t want a long commute. \u00a0Here are \u003Ca href=\u0022https:\/\/www.quora.com\/Should-I-ditch-the-Bay-Area-because-of-the-real-estate-prices-and-cost-of-living-and-move-my-family-to-Idaho\u0022\u003Etwo\u003C\/a\u003E \u003Ca href=\u0022https:\/\/www.quora.com\/Why-should-I-live-in-an-expensive-place-like-the-San-Francisco-Bay-Area\u0022\u003Eposts\u003C\/a\u003E about why the Bay Area is such a great place to live.\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.quora.com\/I-have-a-staff-member-who-produces-brilliant-work-but-is-consistently-late-every-single-day-I-cant-fire-him-because-it-will-take-months-to-find-someone-to-fill-his-position-What-can-I-do\u0022\u003EFlexible hours\u003C\/a\u003E. \u00a0No timesheet. \u00a0Don\u0027t make me ask for permission if I need to take the kid to a doctor\u0027s appointment.\u003C\/li\u003E\u003Cli\u003EMeaningful work:\u00a0Here\u0027s a great Quora post on this very subject:\u00a0\u003Ca href=\u0022https:\/\/www.quora.com\/Why-doesn%E2%80%99t-Microsoft-provide-free-food-for-staff-as-Google-and-Facebook-do\u0022\u003EWhy does Microsoft not have free food like Google and Facebook?\u003C\/a\u003E\u00a0 The bottom line:\u00a0\u0022Meaningful work and compensation are nearly independent variables.\u00a0 The person who answered that question also left a large organization in order to join a startup.\u003C\/li\u003E\u003Cli\u003EI want to\u00a0make a difference. \u00a0At the airport, I was one employee out of 1,600. \u00a0The airport goes to lengths to reassure us that every employee matters. \u00a0But it\u0027s very hard for an individual to have a meaningful impact in a place like that. \u00a0To be sure, the team matters, but that\u0027s true at Pantheon too. \u00a0The difference is that at Pantheon, I\u0027ll be one employee out of 75. \u00a0I\u0027ll be primarily responsible for working on their primary growth vector. \u00a0I\u0027ll be surrounded by a lot of people who are smarter than I am, but I\u0027ll have the space to do something that really matters to the organization on a daily basis.\u003C\/li\u003E\u003Cli\u003ECareer trajectory: I can\u0027t tell you what I\u0027ll be doing in 5 years. \u00a0I can\u0027t even tell you whether I\u0027ll still be at Pantheon. \u00a0But I might be. \u00a0And if I am, I\u0027ll probably be doing something more challenging than what I\u0027ll be doing next week. \u00a0This is a place that fosters career growth.\u003C\/li\u003E\u003Cli\u003EOn a similar note, Pantheon cares about professional development. \u00a0I\u0027ll get to go to all the Badcamps and Drupalcons. \u00a0If I want to learn node.js, they\u0027ll probably support that too (within reason). \u00a0My boss wants employees who will grow and improve. \u00a0That doesn\u0027t just benefit me; it benefits the comapny.\u003C\/li\u003E\u003Cli\u003ECutting edge: Pantheon\u0027s hosting technology is newer and more innovative than the comeptition\u0027s. \u00a0This comes from an institutional willingness to try new things and experiment. \u00a0Responsible experimentation is celebrated, not punished.\u003C\/li\u003E\u003Cli\u003EPragmatism: If you have a problem, solve it. \u00a0If you need a new computer, get one. \u00a0If there\u0027s an important software update, patch it. \u00a0There is a rigorous change management process, but it doesn\u0027t get in the way of progress.\u003C\/li\u003E\u003Cli\u003EPassion: At the airport, some people are smart and driven. \u00a0At Pantheon, pretty much everyone is. \u00a0They have to be, or they wouldn\u0027t last. \u00a0In fact, places like that are self-selecting; if you don\u0027t want to work your butt off and bring your A game every day, then you probably shouldn\u0027t work at a startup in the first place.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EAt one point I confessed to \u003Ca href=\u0022https:\/\/haas.berkeley.edu\/faculty\/isaacs-andrew\/\u0022\u003Emy uncle\u003C\/a\u003E\u00a0that I was worried about giving up the stability and security of a government job. \u00a0His reply: \u0022You\u0027re hard working and reasonably intelligent. \u00a0That\u0027s your job security.\u0022 \u00a0He\u0027s right.\u003C\/p\u003E\u003Cp\u003ESo here I am, on the cusp of a pretty significant career shift. \u00a0Same industry, VERY different work environment. \u00a0Was this a good idea? \u00a0I think so. \u00a0I hope so. \u00a0We\u0027ll find out.\u003C\/p\u003E\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI quit.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EThis is the first time I\u0027ve announced it publicly. \u0026nbsp;Two weeks ago, I was offered a job by \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, and I accepted. \u0026nbsp;That means I\u0027m leaving San Francisco International Airport after more than two years of service. \u0026nbsp;I\u0027d like to share some thoughts on why.\u003C\/p\u003E\n\u003Cp\u003EFirst: My intent is to keep this positive. \u0026nbsp;I could get into personality conflicts or politics, and those things did matter, but that\u0027s not a very interesting article, and certainly doesn\u0027t belong in the public sphere.\u003C\/p\u003E\n\u003Cp\u003EAlso: It\u0027s worth noting that there is a lot of good at the airport. \u0026nbsp;There are some smart, talented, hard working people. \u0026nbsp;I made some friends that I will honestly miss. \u0026nbsp;But that\u0027s not what this article is about either. \u0026nbsp;My point is that the airport does offer a good value proposition. \u0026nbsp;The pay was excellent. \u0026nbsp;The benefits (health, vision, dental, retirement) were unbeatable. \u0026nbsp;I was earning a pension. \u0026nbsp;I was there for over two years - by far the longest I\u0027ve ever stayed at one company. \u0026nbsp;Most of the time, I did interesting things in a cool setting. \u0026nbsp;I got to watch 747\u0027s go by my window all day.\u003C\/p\u003E\n\u003Cp\u003EThe value proposition is what this article is really about. \u0026nbsp;I\u0027m a web developer, and I\u0027m in the unique position of being able to choose where I work. \u0026nbsp;This is a rare luxury, and one I did not enjoy as an attorney. \u0026nbsp;My ability to do this is based in part on my life choices and some hard work, but it\u0027s also based on an insane amount of luck. \u0026nbsp;I\u0027m very grateful, and I thank God every day. \u0026nbsp;\u003Ca href=\u0022https:\/\/www.quora.com\/Do-people-lose-interest-in-programming-as-they-age-Is-it-accurate-to-expect-that-older-programmers-are-slower-make-more-mistakes-and-would-rather-be-doing-something-else-such-as-managing-programmers\u0022\u003EI really love what I do\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EAfter a certain point, your career choice is really a lifestyle choice. \u0026nbsp;Do you want to be an investment banker and earn a million dollars before you turn 24, and spend 80 hours at the office, and have no family and few friends? \u0026nbsp;Do you want to live alone, work at a minimum wage job, and spend all your free time playing video games and getting high? \u0026nbsp;Do you want to work at a stable government job with no prospect of upward mobility for 30 years? \u0026nbsp;Do you want to be a stay at home parent? \u0026nbsp;Do you want a job that offers \u0022work life\u0022 balance so you can work AND have time to raise a family? \u0026nbsp;Do you want to sell your soul and make millions for an evil corporation? \u0026nbsp;Do you want to work for a non-profit and make peanuts but be proud of what you do? \u0026nbsp;Do you want to be a firefighter and risk your life every day? \u0026nbsp;Do you want to work in the medical profession and save lives every day? \u0026nbsp;Do you want to travel? \u0026nbsp;Do you want to sit in front of a computer 8 hours a day? \u0026nbsp;Or 12 hours a day?\u003C\/p\u003E\n\u003Cp\u003EMaybe that\u0027s why Americans ask each other \u0022what do you do,\u0022 when what they really mean is \u0022how do you earn money?\u0022 \u0026nbsp;Because how we choose to earn our money really is a lifestyle choice.\u003C\/p\u003E\n\u003Cp\u003EWhen I decided to leave the airport, I had choices. \u0026nbsp;Do I want to commute for two hours in a car every day? \u0026nbsp;How about a private bus that will take me down the peninsula? \u0026nbsp;How about a company with no office, and I\u0027ll only see my coworkers over skype? \u0026nbsp;How about an office downtown San Francisco that requires me to ride public transit every day? \u0026nbsp;Some people hate public transit. \u0026nbsp;I love it.\u003C\/p\u003E\n\u003Cp\u003EIn addition, because the competition for developers is so high, it\u0027s safe to assume that a job will come with perks. \u0026nbsp;Here are some of the perks I\u0027ve heard about:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.quora.com\/What-is-the-lowest-salary-at-Google\u0022\u003EPeer bonuses\u0026nbsp;\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EFree food.\u003C\/strong\u003E\u0026nbsp;\u0026nbsp;The airport didn\u0027t have it, Pantheon does. \u0026nbsp;Offering food (or at least snacks)\u0026nbsp;belies a more generalized attitude that the company has toward its employees. \u0026nbsp;The airport\u0027s attitude was \u0022we don\u0027t care,\u0022 or \u0022we don\u0027t think it\u0027s a good use of our money.\u0022 \u0026nbsp;Pantheon\u0027s attitude is \u0022we want you to be taken care of.\u0022 \u0026nbsp;Of course I can choose to go buy my own meal whenever I want, and I certainly have enough money to do so. \u0026nbsp;I also have friends downtown and will be surrounded by awesome restaurants and food trucks so yes, I\u0027m sure I will eat out sometimes. \u0026nbsp;But I love knowing that my employer wants to take care of that for me. \u0026nbsp;And to be honest, that benefit adds up to several thousand dollars per year.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EHowever, for most developers,\u0026nbsp;\u003Cstrong\u003Eit\u0027s not really about the perks.\u003C\/strong\u003E \u0026nbsp;It wasn\u0027t for me. \u0026nbsp;Nobody is going to match the health \u0026amp; retirement benefits I had at the airport, to say nothing of the pension, and it will probably be years before I\u0027m earning that much again (at least on paper). \u0026nbsp;Of course, money matters. \u0026nbsp;I have children to feed and a mortgage. \u0026nbsp;But assuming I can get a decent salary, there are more important things:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EStandardized languages, platforms and rules (so it\u0027s not utter chaos) - here\u0027s a great Quora post on \u003Ca href=\u0022https:\/\/www.quora.com\/Why-did-Google-go-with-Java-instead-of-Haskell-Why-are-they-pushing-for-Go-instead-of-using-Haskell-or-Idris-now\u0022\u003Ehow Google does it\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003ELocation:\u0026nbsp;There\u0027s a reason Silicon Valley is the center of the tech world. \u0026nbsp;This is an awesome place to live! \u0026nbsp;In particular, I decided I wanted to work in San Francisco. \u0026nbsp;Not Palo Alto, not Emeryville, definitely not Walnut Creek. \u0026nbsp;A big part of that is because I\u0026nbsp;live in San Francisco, but it\u0027s also because I don\u0027t want to drive and I don\u0027t want a long commute. \u0026nbsp;Here are \u003Ca href=\u0022https:\/\/www.quora.com\/Should-I-ditch-the-Bay-Area-because-of-the-real-estate-prices-and-cost-of-living-and-move-my-family-to-Idaho\u0022\u003Etwo\u003C\/a\u003E \u003Ca href=\u0022https:\/\/www.quora.com\/Why-should-I-live-in-an-expensive-place-like-the-San-Francisco-Bay-Area\u0022\u003Eposts\u003C\/a\u003E about why the Bay Area is such a great place to live.\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.quora.com\/I-have-a-staff-member-who-produces-brilliant-work-but-is-consistently-late-every-single-day-I-cant-fire-him-because-it-will-take-months-to-find-someone-to-fill-his-position-What-can-I-do\u0022\u003EFlexible hours\u003C\/a\u003E. \u0026nbsp;No timesheet. \u0026nbsp;Don\u0027t make me ask for permission if I need to take the kid to a doctor\u0027s appointment.\u003C\/li\u003E\n\u003Cli\u003EMeaningful work:\u0026nbsp;Here\u0027s a great Quora post on this very subject:\u0026nbsp;\u003Ca href=\u0022https:\/\/www.quora.com\/Why-doesn%E2%80%99t-Microsoft-provide-free-food-for-staff-as-Google-and-Facebook-do\u0022\u003EWhy does Microsoft not have free food like Google and Facebook?\u003C\/a\u003E\u0026nbsp; The bottom line:\u0026nbsp;\u0022Meaningful work and compensation are nearly independent variables.\u0026nbsp; The person who answered that question also left a large organization in order to join a startup.\u003C\/li\u003E\n\u003Cli\u003EI want to\u0026nbsp;make a difference. \u0026nbsp;At the airport, I was one employee out of 1,600. \u0026nbsp;The airport goes to lengths to reassure us that every employee matters. \u0026nbsp;But it\u0027s very hard for an individual to have a meaningful impact in a place like that. \u0026nbsp;To be sure, the team matters, but that\u0027s true at Pantheon too. \u0026nbsp;The difference is that at Pantheon, I\u0027ll be one employee out of 75. \u0026nbsp;I\u0027ll be primarily responsible for working on their primary growth vector. \u0026nbsp;I\u0027ll be surrounded by a lot of people who are smarter than I am, but I\u0027ll have the space to do something that really matters to the organization on a daily basis.\u003C\/li\u003E\n\u003Cli\u003ECareer trajectory: I can\u0027t tell you what I\u0027ll be doing in 5 years. \u0026nbsp;I can\u0027t even tell you whether I\u0027ll still be at Pantheon. \u0026nbsp;But I might be. \u0026nbsp;And if I am, I\u0027ll probably be doing something more challenging than what I\u0027ll be doing next week. \u0026nbsp;This is a place that fosters career growth.\u003C\/li\u003E\n\u003Cli\u003EOn a similar note, Pantheon cares about professional development. \u0026nbsp;I\u0027ll get to go to all the Badcamps and Drupalcons. \u0026nbsp;If I want to learn node.js, they\u0027ll probably support that too (within reason). \u0026nbsp;My boss wants employees who will grow and improve. \u0026nbsp;That doesn\u0027t just benefit me; it benefits the comapny.\u003C\/li\u003E\n\u003Cli\u003ECutting edge: Pantheon\u0027s hosting technology is newer and more innovative than the comeptition\u0027s. \u0026nbsp;This comes from an institutional willingness to try new things and experiment. \u0026nbsp;Responsible experimentation is celebrated, not punished.\u003C\/li\u003E\n\u003Cli\u003EPragmatism: If you have a problem, solve it. \u0026nbsp;If you need a new computer, get one. \u0026nbsp;If there\u0027s an important software update, patch it. \u0026nbsp;There is a rigorous change management process, but it doesn\u0027t get in the way of progress.\u003C\/li\u003E\n\u003Cli\u003EPassion: At the airport, some people are smart and driven. \u0026nbsp;At Pantheon, pretty much everyone is. \u0026nbsp;They have to be, or they wouldn\u0027t last. \u0026nbsp;In fact, places like that are self-selecting; if you don\u0027t want to work your butt off and bring your A game every day, then you probably shouldn\u0027t work at a startup in the first place.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAt one point I confessed to \u003Ca href=\u0022https:\/\/haas.berkeley.edu\/faculty\/isaacs-andrew\/\u0022\u003Emy uncle\u003C\/a\u003E\u0026nbsp;that I was worried about giving up the stability and security of a government job. \u0026nbsp;His reply: \u0022You\u0027re hard working and reasonably intelligent. \u0026nbsp;That\u0027s your job security.\u0022 \u0026nbsp;He\u0027s right.\u003C\/p\u003E\n\u003Cp\u003ESo here I am, on the cusp of a pretty significant career shift. \u0026nbsp;Same industry, VERY different work environment. \u0026nbsp;Was this a good idea? \u0026nbsp;I think so. \u0026nbsp;I hope so. \u0026nbsp;We\u0027ll find out.\u003C\/p\u003E\n\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1446663148,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":70}],"uuid":[{"value":"80ed5025-12cf-43cf-9ca2-f6d5f929c9aa"}],"vid":[{"value":338}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-08-20T10:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Why Mac is Better"}],"created":[{"value":"2015-09-29T01:43:04+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-08-20T10:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/why-mac-better","pid":104,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIf you know me, you know how surprising that statement is. \u00a0\u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-takes-another-step-3\u0022\u003EI\u0027ve\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-scientifically-better-6\u0022\u003Ebeen\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-vs-windows-continued\u0022\u003Ea\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-passes-friend-test-2\u0022\u003Edie-hard\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-works-12\u0022\u003ELinux\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/yet-another-reason-why-linux-better-16\u0022\u003Eevangalist\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/5-reasons-your-parents-should-use-linux-5\u0022\u003Efor\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/writing-wall-14\u0022\u003Ethe\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/it-passes-mother-test-12\u0022\u003Epast\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/here-we-go-again-3\u0022\u003E10\u003C\/a\u003E years or so. \u00a0But, as Bob Dylan would say, things have changed.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EI was actually raised on Mac. \u00a0Our family\u0027s first computer was a Macintosh Plus. \u00a0My last was a \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/PowerBook_Duo\u0022\u003EPowerbook 2300c\u003C\/a\u003E, which I took to college. \u00a0(I freaking loved that thing.) \u00a0But then I went through a phase where I used a combination of Linux and Windows, finally settling on Linux around 2005.\u003C\/p\u003E\u003Cp\u003ESo, what\u0027s changed? \u00a0A few things. \u00a0The biggest is that I have a job.\u003C\/p\u003E\u003Ch2\u003ELinux is a Distraction\u003C\/h2\u003E\u003Cp\u003EI\u0027ve used several flavors of Linux, but mostly Ubuntu. \u00a0Ubuntu is my favorite because it\u0027s got a for-profit corporation backing it, and they\u0027ve put a lot of money into making it polished, stable, and well supported. \u00a0It has the best software repository (in terms of number of apps, stability, and how frequently they\u0027re updated). \u00a0It\u0027s got by far the best interface. \u00a0It also has the best hardware support.\u003C\/p\u003E\u003Cp\u003EHowever, in recent years the hardware support has actually gotten\u00a0\u003Cem\u003Eworse\u003C\/em\u003E. \u00a0There are several reasons for this: I use newer laptop hardware with the Optimus chipset. \u00a0Also, at work, I have multiple external monitors plugged into a dock. \u00a0Granted, that\u0027s unusual hardware. \u00a0And the manufacturer doesn\u0027t supply drivers. \u00a0But this stuff used to work better.\u003C\/p\u003E\u003Cp\u003EThe result: Lately I\u0027ve been spending more time on tech support, precisely when I\u0027ve been busier, both at work and at home. \u00a0When I was in college I didn\u0027t mind wrestling with drivers. \u00a0But now that just seems like a distraction.\u003C\/p\u003E\u003Ch2\u003EMac is Basically the Same\u003C\/h2\u003E\u003Cp\u003EI\u0027m really tempted to say \u0022Mac is Linux,\u0022 even though that\u0027s technically not true. \u00a0Mac is Unix, which is so close that it doesn\u0027t really make a difference. \u00a0I mean, it has the same wifi widget and printer daemon! \u00a0I was shocked at how many things are the same. \u00a0Mac even comes with a basic LAMP stack built in. \u00a0Not to mention command line interface with a software repository. \u00a0The interface was a little different, but it also lends itself to customization and I got things almost exactly the way I wanted. \u00a0I do miss the spinny cube on Linux, but the truth is that project hasn\u0027t been adequately supported in years anyway, especially if you don\u0027t have good graphics card support.\u003C\/p\u003E\u003Cp\u003EIn fact, I discovered a lot of things were exactly the same:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EChrome\u003C\/li\u003E\u003Cli\u003EFirefox\u003C\/li\u003E\u003Cli\u003EAptana\u003C\/li\u003E\u003Cli\u003ESkype\u003C\/li\u003E\u003Cli\u003ETerminal with translucent background\u003C\/li\u003E\u003Cli\u003EMultiple desktops\u003C\/li\u003E\u003Cli\u003ELAMP\u003C\/li\u003E\u003Cli\u003Egit\u003C\/li\u003E\u003Cli\u003EMy external speakers, monitor, keyboard, and 7-button mouse\u003C\/li\u003E\u003C\/ul\u003E\u003Ch2\u003EMac is Better\u003C\/h2\u003E\u003Cp\u003EIn fact, Mac is better in some significant ways. \u00a0I\u0027m not talking about iTunes - I don\u0027t think I\u0027ll ever buy into Apple\u0027s entertainment ecosystem. \u00a0I\u0027m also not going to buy an iPhone or Apple Watch - I\u0027m still a devoted Android user (in fact, Google Now works better on Mac than it does on Linux). \u00a0But the real point is that all the advantages of Ubuntu are magnified tenfold with Apple: It\u0027s a very large company with a LOT of money and a superb attention to detail.\u003C\/p\u003E\u003Cp\u003EImagine someone took Linux, polished the hell out of it, and made it super stable. \u00a0\u003Cem\u003EThat\u0027s Mac.\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EIn particular, here are the things that are better, that I actually care about:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EAdobe flash (yes, still)\u003C\/li\u003E\u003Cli\u003EPrinter support\u003C\/li\u003E\u003Cli\u003EHardware support (SSD, graphics card, new chipset)\u003C\/li\u003E\u003Cli\u003EStability\u003C\/li\u003E\u003Cli\u003EGAMES - I don\u0027t have a lot of time to play games any more, but it\u0027s nice to be able to play Starcraft without having to restart my computer!\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EAll that said, there are a few things I miss:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EAbility to scroll through Chrome browser tabs using the mouse scroll wheel\u003C\/li\u003E\u003Cli\u003EEasily show hidden files in a folder\u003C\/li\u003E\u003Cli\u003EThe spinny cube\u003C\/li\u003E\u003Cli\u003EBuilt-in themability for the operating system\u003C\/li\u003E\u003Cli\u003EOn Linux, there\u0027s an expectation that everything is Free and Open Source - there\u0027s a lot more shareware on Mac.\u003C\/li\u003E\u003Cli\u003EMost of all, I miss being a power user and knowing all the nooks \u0026amp; crannies of the OS. \u00a0I used to be a Mac power user, and I\u0027m sure I will be again, but last time I used a Mac was during the Power Mac days. \u00a0OS X is a new beast and it\u0027s different enough from Linux that I still feel like a beginner.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EIf we\u0027re talking about why Mac is better, we really should talk about hardware. \u00a0Mac was rated by JD Power \u0026amp; Associates as the most reliable brand of PC. \u00a0(If you\u0027re on a budget, #2 was Asus. \u00a0About half the price for the same computing power, and my Asus laptop survived beatings for 3 whole years.) \u00a0In addition, Macs are great under the hood. \u00a0A few years ago PC Magazine said the best gaming PC was a Mac. \u00a0Apple has really upped the ante with solid state hard drives. \u00a0(Everything you\u0027ve heard is true; they really are worth it.) \u00a0Finally, it\u0027s\u00a0\u003Cem\u003Ebeautiful\u003C\/em\u003E. \u00a0PC makers have been making more of an effort to offer aesthetically pleasing cases, but really it\u0027s another case of the entire industry chasing Apple. \u00a0If you care about aesthetic beauty, you really can\u0027t beat a Mac.\u003C\/p\u003E\u003Ch2\u003EI can Afford It\u003C\/h2\u003E\u003Cp\u003EEven given all the advantages of Mac, there was one more thing holding me back:\u00a0\u003Cstrong\u003Ecost.\u003C\/strong\u003E \u00a0It doesn\u0027t matter how awesome something is if you can\u0027t afford one. \u00a0But this goes along with Point #1 (having work to do): As my business has increased, so has my income. \u00a0I still have a side business which means my computer is a business expense. \u00a0As long as I can justify the purchase in terms of cash flow, it\u0027s a writeoff at the end of the year. \u00a0When my Linux computer died a few weeks ago, it took me about an hour to decide I was going to buy a Mac. \u00a0It took about a day to get used to it.\u003C\/p\u003E\u003Cp\u003EThe truth is Apple products are luxury items. \u00a0But the real question is which is more precious to you: time or money? \u00a0As always,\u00a0\u003Cstrong\u003Escarcity connotes value:\u003C\/strong\u003E I used to have less money and more free time. \u00a0Now I have more money and less time. \u00a0The choice is clear.\u003C\/p\u003E\u003Ch2\u003EConclusion\u003C\/h2\u003E\u003Cp\u003EDoes this mean I don\u0027t like Linux any more? \u00a0Of course not! \u00a0I\u0027m a web developer! \u00a0Linux is in my bloodstream at this point. \u00a0I\u0027m glad I ran it for all those years. \u00a0But at this point in my career, it\u0027s worth paying for a more polished, more stable tool that will save me time. \u00a0On top of that, I\u0027ve been pleasantly surprised at how many of my \u0022power user\u0022 tricks I\u0027ve been able to replicate from Linux.\u003C\/p\u003E\u003Cp\u003EBottom line: I\u0027m back, baby. \u00a0I may not be an Apple fanboy, but I am a big fan of the hardware and software.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EAddendum: Mac toys\u003C\/h2\u003E\u003Cp\u003EAs mentioned, I was able to get all my advanced GUI enhancements that I missed from Linux. \u00a0If you\u0027re curious, here\u0027s what I used:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022http:\/\/www.bettertouchtool.net\/\u0022\u003EBetter Touch Tool\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/apps.apple.com\/us\/app\/copyclip-clipboard-history\/id595191960?mt=12\u0022\u003ECopyClip\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/brew.sh\/\u0022\u003EHomebrew\u003C\/a\u003E (of course)\u003C\/li\u003E\u003C\/ul\u003E","format":"full_html","processed":"\u003Cp\u003EIf you know me, you know how surprising that statement is. \u0026nbsp;\u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-takes-another-step-3\u0022\u003EI\u0027ve\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-scientifically-better-6\u0022\u003Ebeen\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-vs-windows-continued\u0022\u003Ea\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-passes-friend-test-2\u0022\u003Edie-hard\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/linux-works-12\u0022\u003ELinux\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/yet-another-reason-why-linux-better-16\u0022\u003Eevangalist\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/5-reasons-your-parents-should-use-linux-5\u0022\u003Efor\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/writing-wall-14\u0022\u003Ethe\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/it-passes-mother-test-12\u0022\u003Epast\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowicz.com\/content\/here-we-go-again-3\u0022\u003E10\u003C\/a\u003E years or so. \u0026nbsp;But, as Bob Dylan would say, things have changed.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EI was actually raised on Mac. \u0026nbsp;Our family\u0027s first computer was a Macintosh Plus. \u0026nbsp;My last was a \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/PowerBook_Duo\u0022\u003EPowerbook 2300c\u003C\/a\u003E, which I took to college. \u0026nbsp;(I freaking loved that thing.) \u0026nbsp;But then I went through a phase where I used a combination of Linux and Windows, finally settling on Linux around 2005.\u003C\/p\u003E\n\u003Cp\u003ESo, what\u0027s changed? \u0026nbsp;A few things. \u0026nbsp;The biggest is that I have a job.\u003C\/p\u003E\n\u003Ch2\u003ELinux is a Distraction\u003C\/h2\u003E\n\u003Cp\u003EI\u0027ve used several flavors of Linux, but mostly Ubuntu. \u0026nbsp;Ubuntu is my favorite because it\u0027s got a for-profit corporation backing it, and they\u0027ve put a lot of money into making it polished, stable, and well supported. \u0026nbsp;It has the best software repository (in terms of number of apps, stability, and how frequently they\u0027re updated). \u0026nbsp;It\u0027s got by far the best interface. \u0026nbsp;It also has the best hardware support.\u003C\/p\u003E\n\u003Cp\u003EHowever, in recent years the hardware support has actually gotten\u0026nbsp;\u003Cem\u003Eworse\u003C\/em\u003E. \u0026nbsp;There are several reasons for this: I use newer laptop hardware with the Optimus chipset. \u0026nbsp;Also, at work, I have multiple external monitors plugged into a dock. \u0026nbsp;Granted, that\u0027s unusual hardware. \u0026nbsp;And the manufacturer doesn\u0027t supply drivers. \u0026nbsp;But this stuff used to work better.\u003C\/p\u003E\n\u003Cp\u003EThe result: Lately I\u0027ve been spending more time on tech support, precisely when I\u0027ve been busier, both at work and at home. \u0026nbsp;When I was in college I didn\u0027t mind wrestling with drivers. \u0026nbsp;But now that just seems like a distraction.\u003C\/p\u003E\n\u003Ch2\u003EMac is Basically the Same\u003C\/h2\u003E\n\u003Cp\u003EI\u0027m really tempted to say \u0022Mac is Linux,\u0022 even though that\u0027s technically not true. \u0026nbsp;Mac is Unix, which is so close that it doesn\u0027t really make a difference. \u0026nbsp;I mean, it has the same wifi widget and printer daemon! \u0026nbsp;I was shocked at how many things are the same. \u0026nbsp;Mac even comes with a basic LAMP stack built in. \u0026nbsp;Not to mention command line interface with a software repository. \u0026nbsp;The interface was a little different, but it also lends itself to customization and I got things almost exactly the way I wanted. \u0026nbsp;I do miss the spinny cube on Linux, but the truth is that project hasn\u0027t been adequately supported in years anyway, especially if you don\u0027t have good graphics card support.\u003C\/p\u003E\n\u003Cp\u003EIn fact, I discovered a lot of things were exactly the same:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EChrome\u003C\/li\u003E\n\u003Cli\u003EFirefox\u003C\/li\u003E\n\u003Cli\u003EAptana\u003C\/li\u003E\n\u003Cli\u003ESkype\u003C\/li\u003E\n\u003Cli\u003ETerminal with translucent background\u003C\/li\u003E\n\u003Cli\u003EMultiple desktops\u003C\/li\u003E\n\u003Cli\u003ELAMP\u003C\/li\u003E\n\u003Cli\u003Egit\u003C\/li\u003E\n\u003Cli\u003EMy external speakers, monitor, keyboard, and 7-button mouse\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch2\u003EMac is Better\u003C\/h2\u003E\n\u003Cp\u003EIn fact, Mac is better in some significant ways. \u0026nbsp;I\u0027m not talking about iTunes - I don\u0027t think I\u0027ll ever buy into Apple\u0027s entertainment ecosystem. \u0026nbsp;I\u0027m also not going to buy an iPhone or Apple Watch - I\u0027m still a devoted Android user (in fact, Google Now works better on Mac than it does on Linux). \u0026nbsp;But the real point is that all the advantages of Ubuntu are magnified tenfold with Apple: It\u0027s a very large company with a LOT of money and a superb attention to detail.\u003C\/p\u003E\n\u003Cp\u003EImagine someone took Linux, polished the hell out of it, and made it super stable. \u0026nbsp;\u003Cem\u003EThat\u0027s Mac.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EIn particular, here are the things that are better, that I actually care about:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EAdobe flash (yes, still)\u003C\/li\u003E\n\u003Cli\u003EPrinter support\u003C\/li\u003E\n\u003Cli\u003EHardware support (SSD, graphics card, new chipset)\u003C\/li\u003E\n\u003Cli\u003EStability\u003C\/li\u003E\n\u003Cli\u003EGAMES - I don\u0027t have a lot of time to play games any more, but it\u0027s nice to be able to play Starcraft without having to restart my computer!\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAll that said, there are a few things I miss:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EAbility to scroll through Chrome browser tabs using the mouse scroll wheel\u003C\/li\u003E\n\u003Cli\u003EEasily show hidden files in a folder\u003C\/li\u003E\n\u003Cli\u003EThe spinny cube\u003C\/li\u003E\n\u003Cli\u003EBuilt-in themability for the operating system\u003C\/li\u003E\n\u003Cli\u003EOn Linux, there\u0027s an expectation that everything is Free and Open Source - there\u0027s a lot more shareware on Mac.\u003C\/li\u003E\n\u003Cli\u003EMost of all, I miss being a power user and knowing all the nooks \u0026amp; crannies of the OS. \u0026nbsp;I used to be a Mac power user, and I\u0027m sure I will be again, but last time I used a Mac was during the Power Mac days. \u0026nbsp;OS X is a new beast and it\u0027s different enough from Linux that I still feel like a beginner.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EIf we\u0027re talking about why Mac is better, we really should talk about hardware. \u0026nbsp;Mac was rated by JD Power \u0026amp; Associates as the most reliable brand of PC. \u0026nbsp;(If you\u0027re on a budget, #2 was Asus. \u0026nbsp;About half the price for the same computing power, and my Asus laptop survived beatings for 3 whole years.) \u0026nbsp;In addition, Macs are great under the hood. \u0026nbsp;A few years ago PC Magazine said the best gaming PC was a Mac. \u0026nbsp;Apple has really upped the ante with solid state hard drives. \u0026nbsp;(Everything you\u0027ve heard is true; they really are worth it.) \u0026nbsp;Finally, it\u0027s\u0026nbsp;\u003Cem\u003Ebeautiful\u003C\/em\u003E. \u0026nbsp;PC makers have been making more of an effort to offer aesthetically pleasing cases, but really it\u0027s another case of the entire industry chasing Apple. \u0026nbsp;If you care about aesthetic beauty, you really can\u0027t beat a Mac.\u003C\/p\u003E\n\u003Ch2\u003EI can Afford It\u003C\/h2\u003E\n\u003Cp\u003EEven given all the advantages of Mac, there was one more thing holding me back:\u0026nbsp;\u003Cstrong\u003Ecost.\u003C\/strong\u003E \u0026nbsp;It doesn\u0027t matter how awesome something is if you can\u0027t afford one. \u0026nbsp;But this goes along with Point #1 (having work to do): As my business has increased, so has my income. \u0026nbsp;I still have a side business which means my computer is a business expense. \u0026nbsp;As long as I can justify the purchase in terms of cash flow, it\u0027s a writeoff at the end of the year. \u0026nbsp;When my Linux computer died a few weeks ago, it took me about an hour to decide I was going to buy a Mac. \u0026nbsp;It took about a day to get used to it.\u003C\/p\u003E\n\u003Cp\u003EThe truth is Apple products are luxury items. \u0026nbsp;But the real question is which is more precious to you: time or money? \u0026nbsp;As always,\u0026nbsp;\u003Cstrong\u003Escarcity connotes value:\u003C\/strong\u003E I used to have less money and more free time. \u0026nbsp;Now I have more money and less time. \u0026nbsp;The choice is clear.\u003C\/p\u003E\n\u003Ch2\u003EConclusion\u003C\/h2\u003E\n\u003Cp\u003EDoes this mean I don\u0027t like Linux any more? \u0026nbsp;Of course not! \u0026nbsp;I\u0027m a web developer! \u0026nbsp;Linux is in my bloodstream at this point. \u0026nbsp;I\u0027m glad I ran it for all those years. \u0026nbsp;But at this point in my career, it\u0027s worth paying for a more polished, more stable tool that will save me time. \u0026nbsp;On top of that, I\u0027ve been pleasantly surprised at how many of my \u0022power user\u0022 tricks I\u0027ve been able to replicate from Linux.\u003C\/p\u003E\n\u003Cp\u003EBottom line: I\u0027m back, baby. \u0026nbsp;I may not be an Apple fanboy, but I am a big fan of the hardware and software.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EAddendum: Mac toys\u003C\/h2\u003E\n\u003Cp\u003EAs mentioned, I was able to get all my advanced GUI enhancements that I missed from Linux. \u0026nbsp;If you\u0027re curious, here\u0027s what I used:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022http:\/\/www.bettertouchtool.net\/\u0022\u003EBetter Touch Tool\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/apps.apple.com\/us\/app\/copyclip-clipboard-history\/id595191960?mt=12\u0022\u003ECopyClip\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/brew.sh\/\u0022\u003EHomebrew\u003C\/a\u003E (of course)\u003C\/li\u003E\n\u003C\/ul\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1443491029,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":69}],"uuid":[{"value":"15fdd3ef-8ea4-4d4e-bd46-ba22394a1dd8"}],"vid":[{"value":388}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2023-08-17T13:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Pantheon in Local: A Safer Way"}],"created":[{"value":"2015-07-24T04:38:49+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2023-08-17T13:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/pantheon-local-safer-way","pid":103,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve spoken before (\u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/drupal-getting-started\u0022\u003Eseveral\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/performance-making-js-sit-back-bus\u0022\u003Etimes\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/panels-vs-blocks\u0022\u003Eactually\u003C\/a\u003E) about \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, a high performance web host. \u00a0They\u0027re an amazing platform with many awesome features, but one lacking feature is an easy way to do local development. \u00a0\u003Ca href=\u0022https:\/\/www.kalamuna.com\/products\/kalabox\/\u0022\u003EKalabox 2\u003C\/a\u003E promises to change this, but as we went to press Pantheon integration wasn\u0027t working yet. \u00a0The good news: there\u0027s an easy way to do this.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EFor starters, \u003Ca href=\u0022https:\/\/docs.pantheon.io\/articles\/local\/\u0022\u003EPantheon makes it very easy to pull down your content\u003C\/a\u003E. \u00a0However, you\u0027re left with a problem: how to actually\u00a0\u003Cem\u003Erun\u003C\/em\u003E your site locally. \u00a0If you\u0027re a beginner, you could use \u003Ca href=\u0022https:\/\/www.mamp.info\/en\/\u0022\u003EMAMP\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/www.kalamuna.com\/products\/kalabox\/\u0022\u003EKalabox\u003C\/a\u003E. \u00a0If you\u0027re a propeller head like me, you\u0027ve already installed a \u003Ca href=\u0022https:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u0022\u003Efull LAMP stack on Ubuntu\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EBut there\u0027s still a problem:\u00a0\u003Cstrong\u003Eyou don\u0027t want to mess up settings.php.\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003EWhen you\u0027re done working locally and want to push back up to Pantheon, the server will check sites\/default\/settings.php, and it will expect to see settings specific to Pantheon. \u00a0If you\u0027ve edited that file for your local environment, you may have just broken your entire site.\u003C\/p\u003E\u003Cp\u003EThe solution:\u00a0\u003Cstrong\u003Emultisite. \u00a0Kind of.\u003C\/strong\u003E\u003C\/p\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/docs\/7\/multisite\/multi-site-sharing-the-same-code-base\u0022\u003EMultisite\u003C\/a\u003E is a very fancy Drupal feature where you can host several different websites using the same code base. \u00a0\u003Ca href=\u0022https:\/\/pantheon.io\/blog\u0022\u003EPantheon discourages this\u003C\/a\u003E, but what we\u0027re doing here isn\u0027t really multisite. \u00a0It\u0027s a clever sleight of hand that protects settings.php but still lets you work locally -\u00a0\u003Cem\u003Eeasily\u003C\/em\u003E.\u003C\/p\u003E\u003Ch2\u003ELet\u0027s Do It\u003C\/h2\u003E\u003Cp\u003EEnough introduction. \u00a0Here\u0027s the magic.\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EFirst, \u003Ca href=\u0022https:\/\/docs.pantheon.io\/articles\/local\/\u0022\u003Efollow the instructions\u003C\/a\u003E to pull down your site from Pantheon into your local environment.\u003C\/li\u003E\u003Cli\u003EOpen your site in your favorite file manager or IDE, and go inside the sites directory:\u003Cbr \/\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212014.jpg\u0022 \/\u003E\u003C\/li\u003E\u003Cli\u003ECreate a new folder called\u00a0\u003Cstrong\u003Elocalhost:\u003C\/strong\u003E\u003Cbr \/\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212116.jpg\u0022 \/\u003E\u003C\/li\u003E\u003Cli\u003ESet up this new directory just like you would for a new site (\u003Ca href=\u0022https:\/\/www.drupal.org\/documentation\/install\/beginners\u0022\u003Esee instructions\u003C\/a\u003E\u00a0- especially the part about settings.php and the database):\u003Cbr \/\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212433.jpg\u0022 \/\u003E\u003C\/li\u003E\u003Cli\u003EUse your favorite method to import the database to the local db you designated in settings.php. \u00a0I recommend drush.\u003C\/li\u003E\u003Cli\u003EGo visit your local site, eg. http:\/\/localhost\/code-demo . \u00a0And voila, your site is there!\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003E\u003Cstrong\u003EWhy does this work? \u003C\/strong\u003E\u00a0Because of \u003Ca href=\u0022https:\/\/api.drupal.org\/api\/drupal\/sites!example.sites.php\/7\u0022\u003Ethe way Drupal resolves domain names\u003C\/a\u003E. \u00a0Drupal will pick up \u0022localhost\u0022 from the url and direct you to sites\/localhost.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EWhy is this a good idea?\u003C\/strong\u003E \u00a0Because you never touch sites\/default\/settings.php . \u00a0It stays loaded with lots of Pantheon goodness. \u00a0Conversely, when you upload back to Pantheon, the server will ignore your sites\/localhost. \u00a0Everybody wins.\u003C\/p\u003E\u003Ch2\u003EConclusion\u003C\/h2\u003E\u003Cp\u003EThere are lots of ways to pull a Pantheon site down to your local environment. \u00a0This way may not be the easiest, but it is the simplest. \u00a0I\u0027ve had great success with this technique and I hope you will too.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve spoken before (\u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/drupal-getting-started\u0022\u003Eseveral\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/performance-making-js-sit-back-bus\u0022\u003Etimes\u003C\/a\u003E \u003Ca href=\u0022http:\/\/koplowiczandsons.com\/content\/panels-vs-blocks\u0022\u003Eactually\u003C\/a\u003E) about \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, a high performance web host. \u0026nbsp;They\u0027re an amazing platform with many awesome features, but one lacking feature is an easy way to do local development. \u0026nbsp;\u003Ca href=\u0022https:\/\/www.kalamuna.com\/products\/kalabox\/\u0022\u003EKalabox 2\u003C\/a\u003E promises to change this, but as we went to press Pantheon integration wasn\u0027t working yet. \u0026nbsp;The good news: there\u0027s an easy way to do this.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EFor starters, \u003Ca href=\u0022https:\/\/docs.pantheon.io\/articles\/local\/\u0022\u003EPantheon makes it very easy to pull down your content\u003C\/a\u003E. \u0026nbsp;However, you\u0027re left with a problem: how to actually\u0026nbsp;\u003Cem\u003Erun\u003C\/em\u003E your site locally. \u0026nbsp;If you\u0027re a beginner, you could use \u003Ca href=\u0022https:\/\/www.mamp.info\/en\/\u0022\u003EMAMP\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/www.kalamuna.com\/products\/kalabox\/\u0022\u003EKalabox\u003C\/a\u003E. \u0026nbsp;If you\u0027re a propeller head like me, you\u0027ve already installed a \u003Ca href=\u0022https:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u0022\u003Efull LAMP stack on Ubuntu\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EBut there\u0027s still a problem:\u0026nbsp;\u003Cstrong\u003Eyou don\u0027t want to mess up settings.php.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EWhen you\u0027re done working locally and want to push back up to Pantheon, the server will check sites\/default\/settings.php, and it will expect to see settings specific to Pantheon. \u0026nbsp;If you\u0027ve edited that file for your local environment, you may have just broken your entire site.\u003C\/p\u003E\n\u003Cp\u003EThe solution:\u0026nbsp;\u003Cstrong\u003Emultisite. \u0026nbsp;Kind of.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/docs\/7\/multisite\/multi-site-sharing-the-same-code-base\u0022\u003EMultisite\u003C\/a\u003E is a very fancy Drupal feature where you can host several different websites using the same code base. \u0026nbsp;\u003Ca href=\u0022https:\/\/pantheon.io\/blog\u0022\u003EPantheon discourages this\u003C\/a\u003E, but what we\u0027re doing here isn\u0027t really multisite. \u0026nbsp;It\u0027s a clever sleight of hand that protects settings.php but still lets you work locally -\u0026nbsp;\u003Cem\u003Eeasily\u003C\/em\u003E.\u003C\/p\u003E\n\u003Ch2\u003ELet\u0027s Do It\u003C\/h2\u003E\n\u003Cp\u003EEnough introduction. \u0026nbsp;Here\u0027s the magic.\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EFirst, \u003Ca href=\u0022https:\/\/docs.pantheon.io\/articles\/local\/\u0022\u003Efollow the instructions\u003C\/a\u003E to pull down your site from Pantheon into your local environment.\u003C\/li\u003E\n\u003Cli\u003EOpen your site in your favorite file manager or IDE, and go inside the sites directory:\u003Cbr\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212014.jpg\u0022\u003E\u003C\/li\u003E\n\u003Cli\u003ECreate a new folder called\u0026nbsp;\u003Cstrong\u003Elocalhost:\u003C\/strong\u003E\u003Cbr\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212116.jpg\u0022\u003E\u003C\/li\u003E\n\u003Cli\u003ESet up this new directory just like you would for a new site (\u003Ca href=\u0022https:\/\/www.drupal.org\/documentation\/install\/beginners\u0022\u003Esee instructions\u003C\/a\u003E\u0026nbsp;- especially the part about settings.php and the database):\u003Cbr\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152307212433.jpg\u0022\u003E\u003C\/li\u003E\n\u003Cli\u003EUse your favorite method to import the database to the local db you designated in settings.php. \u0026nbsp;I recommend drush.\u003C\/li\u003E\n\u003Cli\u003EGo visit your local site, eg. \u003Ca href=\u0022http:\/\/localhost\/code-demo\u0022\u003Ehttp:\/\/localhost\/code-demo\u003C\/a\u003E . \u0026nbsp;And voila, your site is there!\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003E\u003Cstrong\u003EWhy does this work? \u003C\/strong\u003E\u0026nbsp;Because of \u003Ca href=\u0022https:\/\/api.drupal.org\/api\/drupal\/sites!example.sites.php\/7\u0022\u003Ethe way Drupal resolves domain names\u003C\/a\u003E. \u0026nbsp;Drupal will pick up \u0022localhost\u0022 from the url and direct you to sites\/localhost.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWhy is this a good idea?\u003C\/strong\u003E \u0026nbsp;Because you never touch sites\/default\/settings.php . \u0026nbsp;It stays loaded with lots of Pantheon goodness. \u0026nbsp;Conversely, when you upload back to Pantheon, the server will ignore your sites\/localhost. \u0026nbsp;Everybody wins.\u003C\/p\u003E\n\u003Ch2\u003EConclusion\u003C\/h2\u003E\n\u003Cp\u003EThere are lots of ways to pull a Pantheon site down to your local environment. \u0026nbsp;This way may not be the easiest, but it is the simplest. \u0026nbsp;I\u0027ve had great success with this technique and I hope you will too.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1437712826,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":67}],"uuid":[{"value":"18c7752a-d149-4a2e-ba3a-0152cfd1aaf2"}],"vid":[{"value":70}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2015-04-30T19:02:47+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Selenium Webdriver tips"}],"created":[{"value":"2015-04-30T16:06:24+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2015-04-30T19:02:47+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/selenium-webdriver-tips","pid":101,"langcode":"und"}],"body":[{"value":"\u003Cp\u003E\u003Ca href=\u0022http:\/\/docs.seleniumhq.org\/\u0022\u003ESelenium Webdriver\u003C\/a\u003E\u0026nbsp;is an automated testing platform for web pages. \u0026nbsp;It may not be the easiest or the most user-friendly, and it definitely requires a lot of coding, but it\u0027s the most powerful and works with\u0026nbsp;any\u0026nbsp;website. \u0026nbsp;Even better, it \u0022drives\u0022 a real web browser and simulates real clicks, so you\u0027re getting a real UI test, not just a URL test. \u0026nbsp;\u003C\/p\u003E\u003Cp\u003EIt\u0027s good stuff, but it\u0027s also arcane. \u0026nbsp;That\u0027s why I\u0027m putting together this handy cheat sheet. \u0026nbsp;Expect it to change over time.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003ENote: Webdriver supports many languages; my syntax is all for java. \u0026nbsp;Don\u0027t ask me why.\u003C\/em\u003E\u003C\/p\u003E\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth scope=\u0022col\u0022\u003ETASK\u003C\/th\u003E\u003Cth scope=\u0022col\u0022\u003ECODE\u003C\/th\u003E\u003C\/tr\u003E\u003C\/thead\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EStart a new web driver, set window size \u0026amp; position\u003C\/td\u003E\u003Ctd\u003E\u003Cp\u003EWebDriver driver = new FirefoxDriver();\u003Cbr\u003Edriver.manage().window().setSize(new Dimension(1024,768));\u003Cbr\u003Edriver.manage().window().setPosition(new Point(800,0));\u003Cbr\u003Edriver.get(domain);\u003C\/p\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EMake sure an element has loaded before you target it (implicit wait)\u003C\/td\u003E\u003Ctd\u003E\u003Cdiv\u003EWebElement uname = (new WebDriverWait(driver, 60))\u003C\/div\u003E\u003Cdiv\u003E.until(ExpectedConditions.presenceOfElementLocated(By.id(\u0022edit-name\u0022)));\u003C\/div\u003E\u003Cdiv\u003Euname.sendKeys(username);\u003C\/div\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EMake the script wait (explicit\u0026nbsp;wait)\u003C\/td\u003E\u003Ctd\u003EThread.sleep(500);\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EClose the window when you\u0027re done\u003C\/td\u003E\u003Ctd\u003Edriver.quit();\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003ETake a screenshot\u003C\/td\u003E\u003Ctd\u003E\u003Cdiv\u003EFile scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);\u003C\/div\u003E\u003Cdiv\u003Etry {\u003C\/div\u003E\u003Cdiv\u003EFileUtils.copyFile(scrFile, new File(screenshot + \u0022.png\u0022));\u003C\/div\u003E\u003Cdiv\u003E} catch (IOException e) {\u003C\/div\u003E\u003Cdiv\u003E\/\/ Auto-generated catch block\u003C\/div\u003E\u003Cdiv\u003Ee.printStackTrace();\u003C\/div\u003E\u003Cdiv\u003E}\u003C\/div\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EClick on a web element\u003C\/td\u003E\u003Ctd\u003Edriver.findElement(By.linkText(\u0022EDIT\u0022)).click();\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003ESelect from a dropdown menu\u003C\/td\u003E\u003Ctd\u003Enew Select(driver.findElement(By.id(\u0022edit-status\u0022))).selectByVisibleText(\u0022No\u0022);\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EMake sure something is selected\u003C\/td\u003E\u003Ctd\u003EAssert.assertTrue(driver.findElement(By.id(\u0022edit-status-0\u0022)).isSelected());\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EMake sure text is present on a page\u003C\/td\u003E\u003Ctd\u003E\u003Cdiv\u003EString body = driver.findElement(By.tagName(\u0022body\u0022)).getText();\u003C\/div\u003E\u003Cdiv\u003EAssert.assertTrue(body.contains(constant.targetuser));\u003C\/div\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003ESend report to console\u003C\/td\u003E\u003Ctd\u003ESystem.out.println(\u0022Turnover note found\u0022);\u003Cbr\u003E\u0026nbsp;\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EFind an element using xpath\u003C\/td\u003E\u003Ctd\u003Edriver.findElement(By.xpath(\u0022\/\/a[@class=\u0027username\u0027]\u0022));\u003C\/td\u003E\u003C\/tr\u003E\u003C\/tbody\u003E\u003C\/table\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003E\u003Ca href=\u0022http:\/\/docs.seleniumhq.org\/\u0022\u003ESelenium Webdriver\u003C\/a\u003E\u0026nbsp;is an automated testing platform for web pages. \u0026nbsp;It may not be the easiest or the most user-friendly, and it definitely requires a lot of coding, but it\u0027s the most powerful and works with\u0026nbsp;any\u0026nbsp;website. \u0026nbsp;Even better, it \u0022drives\u0022 a real web browser and simulates real clicks, so you\u0027re getting a real UI test, not just a URL test. \u0026nbsp;\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s good stuff, but it\u0027s also arcane. \u0026nbsp;That\u0027s why I\u0027m putting together this handy cheat sheet. \u0026nbsp;Expect it to change over time.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003ENote: Webdriver supports many languages; my syntax is all for java. \u0026nbsp;Don\u0027t ask me why.\u003C\/em\u003E\u003C\/p\u003E\n\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022\u003E\n\u003Cthead\u003E\n\u003Ctr\u003E\n\u003Cth scope=\u0022col\u0022\u003ETASK\u003C\/th\u003E\n\u003Cth scope=\u0022col\u0022\u003ECODE\u003C\/th\u003E\n\u003C\/tr\u003E\n\u003C\/thead\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EStart a new web driver, set window size \u0026amp; position\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cp\u003EWebDriver driver = new FirefoxDriver();\u003Cbr\u003Edriver.manage().window().setSize(new Dimension(1024,768));\u003Cbr\u003Edriver.manage().window().setPosition(new Point(800,0));\u003Cbr\u003Edriver.get(domain);\u003C\/p\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EMake sure an element has loaded before you target it (implicit wait)\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cdiv\u003EWebElement uname = (new WebDriverWait(driver, 60))\u003C\/div\u003E\n\u003Cdiv\u003E.until(ExpectedConditions.presenceOfElementLocated(By.id(\u0022edit-name\u0022)));\u003C\/div\u003E\n\u003Cdiv\u003Euname.sendKeys(username);\u003C\/div\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EMake the script wait (explicit\u0026nbsp;wait)\u003C\/td\u003E\n\u003Ctd\u003EThread.sleep(500);\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EClose the window when you\u0027re done\u003C\/td\u003E\n\u003Ctd\u003Edriver.quit();\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003ETake a screenshot\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cdiv\u003EFile scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);\u003C\/div\u003E\n\u003Cdiv\u003Etry {\u003C\/div\u003E\n\u003Cdiv\u003EFileUtils.copyFile(scrFile, new File(screenshot + \u0022.png\u0022));\u003C\/div\u003E\n\u003Cdiv\u003E} catch (IOException e) {\u003C\/div\u003E\n\u003Cdiv\u003E\/\/ Auto-generated catch block\u003C\/div\u003E\n\u003Cdiv\u003Ee.printStackTrace();\u003C\/div\u003E\n\u003Cdiv\u003E}\u003C\/div\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EClick on a web element\u003C\/td\u003E\n\u003Ctd\u003Edriver.findElement(By.linkText(\u0022EDIT\u0022)).click();\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003ESelect from a dropdown menu\u003C\/td\u003E\n\u003Ctd\u003Enew Select(driver.findElement(By.id(\u0022edit-status\u0022))).selectByVisibleText(\u0022No\u0022);\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EMake sure something is selected\u003C\/td\u003E\n\u003Ctd\u003EAssert.assertTrue(driver.findElement(By.id(\u0022edit-status-0\u0022)).isSelected());\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EMake sure text is present on a page\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cdiv\u003EString body = driver.findElement(By.tagName(\u0022body\u0022)).getText();\u003C\/div\u003E\n\u003Cdiv\u003EAssert.assertTrue(body.contains(constant.targetuser));\u003C\/div\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003ESend report to console\u003C\/td\u003E\n\u003Ctd\u003ESystem.out.println(\u0022Turnover note found\u0022);\u003Cbr\u003E\u0026nbsp;\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EFind an element using xpath\u003C\/td\u003E\n\u003Ctd\u003Edriver.findElement(By.xpath(\u0022\/\/a[@class=\u0027username\u0027]\u0022));\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003C\/tbody\u003E\n\u003C\/table\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":66}],"uuid":[{"value":"17ecdbf0-ae66-4a48-a53f-f26463ff4a42"}],"vid":[{"value":394}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2024-05-03T16:45:25+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Auto Update Drupal Multisite"}],"created":[{"value":"2015-04-07T04:28:42+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-05-03T16:45:25+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/auto-update-drupal-multisite","pid":100,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI was recently talking with the fine folks at UCSF.edu and they mentioned that they do updates of giant Drupal multisites. \u0026nbsp;I asked them how they manage that. \u0026nbsp;The answer: a script! \u0026nbsp;So of course I wanted one too.\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u003C--break-\u003E\u0022 src=\u0022\/sites\/all\/modules\/wysiwyg\/plugins\/break\/images\/spacer.gif\u0022 title=\u0022\u003C--break--\u003E\u0022\u003E\u003C\/p\u003E\u003Cp\u003EHere are my steps:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003ECreate a bash script in your home directory (or somewhere\u0026nbsp;outside\u0026nbsp;your web root)\u003C\/li\u003E\u003Cli\u003EMake the script executable: sudo chmod +x myscript\u003C\/li\u003E\u003Cli\u003EPut the following code inside your script: https:\/\/gist.github.com\/koppieesq\/2ccb8b562e56ae8dad767db9812a25bf\u003C\/li\u003E\u003C\/ol\u003E","format":"raw_html","processed":"\u003Cp\u003EI was recently talking with the fine folks at UCSF.edu and they mentioned that they do updates of giant Drupal multisites. \u0026nbsp;I asked them how they manage that. \u0026nbsp;The answer: a script! \u0026nbsp;So of course I wanted one too.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt=\u0022\u0026lt;--break-\u0026gt;\u0022 src=\u0022\/sites\/all\/modules\/wysiwyg\/plugins\/break\/images\/spacer.gif\u0022 title=\u0022\u0026lt;--break--\u0026gt;\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EHere are my steps:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003ECreate a bash script in your home directory (or somewhere\u0026nbsp;outside\u0026nbsp;your web root)\u003C\/li\u003E\n\u003Cli\u003EMake the script executable: sudo chmod +x myscript\u003C\/li\u003E\n\u003Cli\u003EPut the following code inside your script: \u003Ca href=\u0022https:\/\/gist.github.com\/koppieesq\/2ccb8b562e56ae8dad767db9812a25bf\u0022\u003Ehttps:\/\/gist.github.com\/koppieesq\/2ccb8b562e56ae8dad767db9812a25bf\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ol\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1428381455,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":65}],"uuid":[{"value":"e45693cd-64e0-431a-b1ce-6dd47191f8c6"}],"vid":[{"value":236}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Project Spartan: Is it Compatible?"}],"created":[{"value":"2015-03-20T22:38:24+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/project-spartan-it-compatible","pid":99,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EAt work we\u0027re still stuck on IE9. \u00a0We just started the discussion of upgrading our web browser, and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Spartan_(browser)\u0022\u003EProject Spartan\u003C\/a\u003E came up. \u00a0As a web developer, there\u0027s only one thing I care about: is it compatible?\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0026lt;--break-\u0026gt;\u0022 src=\u0022\/sites\/all\/modules\/wysiwyg\/plugins\/break\/images\/spacer.gif\u0022 title=\u0022\u0026lt;--break--\u0026gt;\u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003ESo what is Project Spartan? \u00a0It\u0027s Microsoft\u0027s new web browser which totally won\u0027t suck because it\u0027s totally not Internet Explorer. \u00a0(Except it is - it\u0027s a fork of the Trident rendering engine. \u00a0But nobody likes IE so it\u0027s totally something new, we swear.)\u003C\/p\u003E\u003Cp\u003ESo, is it compatible? \u00a0The good news: It\u0027s a lot better than Internet Explorer. \u00a0And it\u0027s getting better; Microsoft has promised to work with the W3C about any problems they find. \u00a0We don\u0027t even have a working beta yet; you have to load IE11 in the preview version of Windows 10 and turn on edge mode rendering to get the new Spartan engine. \u00a0So, lots of time for improvements.\u003C\/p\u003E\u003Cp\u003EBut how does it stack up so far? \u00a0Let\u0027s look at\u00a0\u003Ca href=\u0022http:\/\/html5test.com\u0022\u003Ehtml5test.com\u003C\/a\u003E, a real time browser standards testing suite. \u00a0Here\u0027s how Spartan stacks up:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EChrome: 498 (out of 555 possible points - higher is better)\u003C\/li\u003E\u003Cli\u003EFirefox: 448\u003C\/li\u003E\u003Cli\u003EProject Spartan: 343\u003C\/li\u003E\u003Cli\u003EIE9: 113\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThat last one was just for fun. \u00a0It\u0027s obvious that the IE engine has come a LONG way in four years. \u00a0But Spartan still falls far short of the \u0022true\u0022 standars-compliant browsers, Chrome and Firefox. \u00a0And given Microsoft\u0027s history, and their continued adherence to the Trident engine, I don\u0027t expect it to get much better.\u003C\/p\u003E\u003Cp\u003EBut for now, ladies and gentlemen of the jury, the hearing is continued.\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152003153942.jpg\u0022 \/\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EAt work we\u0027re still stuck on IE9. \u0026nbsp;We just started the discussion of upgrading our web browser, and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Spartan_(browser)\u0022\u003EProject Spartan\u003C\/a\u003E came up. \u0026nbsp;As a web developer, there\u0027s only one thing I care about: is it compatible?\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt=\u0022\u0026lt;--break-\u0026gt;\u0022 src=\u0022\/sites\/all\/modules\/wysiwyg\/plugins\/break\/images\/spacer.gif\u0022 title=\u0022\u0026lt;--break--\u0026gt;\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003ESo what is Project Spartan? \u0026nbsp;It\u0027s Microsoft\u0027s new web browser which totally won\u0027t suck because it\u0027s totally not Internet Explorer. \u0026nbsp;(Except it is - it\u0027s a fork of the Trident rendering engine. \u0026nbsp;But nobody likes IE so it\u0027s totally something new, we swear.)\u003C\/p\u003E\n\u003Cp\u003ESo, is it compatible? \u0026nbsp;The good news: It\u0027s a lot better than Internet Explorer. \u0026nbsp;And it\u0027s getting better; Microsoft has promised to work with the W3C about any problems they find. \u0026nbsp;We don\u0027t even have a working beta yet; you have to load IE11 in the preview version of Windows 10 and turn on edge mode rendering to get the new Spartan engine. \u0026nbsp;So, lots of time for improvements.\u003C\/p\u003E\n\u003Cp\u003EBut how does it stack up so far? \u0026nbsp;Let\u0027s look at\u0026nbsp;\u003Ca href=\u0022http:\/\/html5test.com\u0022\u003Ehtml5test.com\u003C\/a\u003E, a real time browser standards testing suite. \u0026nbsp;Here\u0027s how Spartan stacks up:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EChrome: 498 (out of 555 possible points - higher is better)\u003C\/li\u003E\n\u003Cli\u003EFirefox: 448\u003C\/li\u003E\n\u003Cli\u003EProject Spartan: 343\u003C\/li\u003E\n\u003Cli\u003EIE9: 113\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThat last one was just for fun. \u0026nbsp;It\u0027s obvious that the IE engine has come a LONG way in four years. \u0026nbsp;But Spartan still falls far short of the \u0022true\u0022 standars-compliant browsers, Chrome and Firefox. \u0026nbsp;And given Microsoft\u0027s history, and their continued adherence to the Trident engine, I don\u0027t expect it to get much better.\u003C\/p\u003E\n\u003Cp\u003EBut for now, ladies and gentlemen of the jury, the hearing is continued.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20152003153942.jpg\u0022\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1537218001,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":64}],"uuid":[{"value":"30cf423e-fc17-4051-8620-4fc0fb6ae7c7"}],"vid":[{"value":373}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-11-10T03:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"VPS: It\u0027s Awesome, and It Might Kill Me"}],"created":[{"value":"2015-02-02T07:57:04+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-11-10T03:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/vps-its-awesome-and-it-might-kill-me","pid":98,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ESo, I made the leap from\u00a0\u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003Eshared hosting\u003C\/a\u003E\u00a0to a\u00a0\u003Ca href=\u0022https:\/\/www.digitalocean.com\/\u0022\u003Evirtual private server\u003C\/a\u003E. \u00a0Why? \u00a0A few reasons:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EYou\u0027ll never get great performance from shared hosting\u003C\/li\u003E\u003Cli\u003EI\u0027ve gained confidence in my own ability to devops\u003C\/li\u003E\u003Cli\u003EI\u0027m trying to improve my skill set\u003C\/li\u003E\u003Cli\u003EIt\u0027s\u00a0actually cheaper; $7\/mo for Hostgator shared hosting vs. $5\/mo for Digital Ocean\u003C\/li\u003E\u003Cli\u003EIt\u0027s fun! \u00a0(I need to get out more.)\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EMy first reaction?\u003C\/p\u003E\u003Cp\u003E\u003Ciframe allowfullscreen=\u0022\u0022 frameborder=\u00220\u0022 height=\u0022315\u0022 src=\u0022https:\/\/www.youtube.com\/embed\/g2O7rZTBs7w\u0022 width=\u0022560\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\u003Cp\u003ENot even kidding. \u00a0It was literally as fun as flying an alien spaceship out of a secret government facility with Jeff Goldblum. \u00a0Why?\u003C\/p\u003E\u003Cp\u003ESimply put: I can do cool stuff now. \u00a0Varnish. \u00a0Memcached. \u00a0New Relic. \u00a0Control my own environment, including resources and firewall. \u00a0If I want I can double my resources for $10\/mo, but I won\u0027t need to. \u00a0I\u0027m hosting 8 websites off a single server, and\u00a0every single one of them screams.\u00a0\u00a0Here\u0027s a quote from an actual client:\u003C\/p\u003E\u003Cblockquote\u003E\u003Cstrong\u003EIT\u2019S FANTASTIC! You\u2019re right; much, much faster. \u00a0In fact, instant!!!!! \u00a0 \u00a0THANK YOU!\u003C\/strong\u003E\u003C\/blockquote\u003E\u003Cdiv\u003EOf course, it\u0027s got its challenges. \u00a0The biggest was mail. \u00a0I had lots of mail forwarders set up, and several domains use Google Apps. \u00a0Now I need to figure out how to manage all those myself.\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EThe answer: postfix. \u00a0Well, there are multiple answers, of course, but postfix seems to be popular for being simple. \u00a0Of course it\u0027s not really that simple. \u00a0First you have to set up the postfix daemon itself, with text-only configuration files. \u00a0Then you have to set up an authentication engine. \u00a0I chose dovecot because it had the clearest \u0022howto.\u0022 \u00a0Plus several hours of banging my head against a wall. \u00a0Literally. \u00a0(Turns out the banging didn\u0027t help.)\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003ESo, how to do it? \u00a0Here\u0027s how:\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Ch2\u003EHow to Set Up Mail Forwarding on a VPS\u003C\/h2\u003E\u003Cp\u003EFirst, what this isn\u0027t: This isn\u0027t a full-fledged mail server. \u00a0No POP3, no IMAP. \u00a0No local storage of emails. \u00a0No spam filtering, no antivirus. \u00a0All my forwards are going to gmail, which already has excellent spam filtering and antivirus. \u00a0Maybe one day when I\u0027m bored I\u0027ll add these things, but honestly at this point I\u0027m afraid to\u00a0sneeze\u00a0at the server. \u00a0This feeling will pass. \u00a0Give me 24 hours and I\u0027m sure I\u0027ll be messing with it in ways that would make Marilyn Manson say \u0022dude, tone it down.\u0022\u003C\/p\u003E\u003Cp\u003EThis is a mail forwarder. \u00a0It\u0027s also an SMTP server; I can send emails from my virtual domains, eg. me@mydomain.com. \u00a0The trick is making sure the spammers don\u0027t get in; I made that mistake back in 2003, when I was running an IIS server out of my apartment. \u00a0Good times.\u003C\/p\u003E\u003Cp\u003EOK, so how did I stumble into success?\u003C\/p\u003E\u003Ch3\u003EInstall Postfix\u003C\/h3\u003E\u003Cp\u003ERead\u00a0\u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-configure-postfix-on-ubuntu-14-04\u0022\u003Ethis excellent tutorial from Digital Ocean\u003C\/a\u003E. \u00a0Turns out Digital Ocean is really cool like that. \u00a0They don\u0027t just hand you the keys to the porsche (although they do that); they also hand you a map and driving directions to the nearest gas station and the freeway. \u00a0In this case, they had a tutorial for the specific operating system I was using.\u003C\/p\u003E\u003Cp\u003EShort version: install the daemon using apt-get. \u00a0Edit the text-only configuration file. \u00a0Restart the daemon.\u003C\/p\u003E\u003Ch3\u003EAdd virtual aliases\u003C\/h3\u003E\u003Cp\u003ETurns out it doesn\u0027t matter if you\u0027ve already edited your MX records to point to Google Apps. \u00a0The mail request still goes through postfix first. \u00a0So you need a \u0022virtual\u0022 file where you list your aliases. \u00a0Eg. special@mydomain.com forwards to regular@gmail.com.\u003C\/p\u003E\u003Cp\u003ETip: You have to\u00a0\u003Ca href=\u0022https:\/\/forum.howtoforge.com\/threads\/postfix-user-unknown-in-virtual-alias-table.66602\/\u0022\u003Eload your \u0022virtual\u0022 file into postfix\u003C\/a\u003E\u00a0after you edit, and then restart the postfix daemon again.\u003C\/p\u003E\u003Ch3\u003EAdd Dovecot\u003C\/h3\u003E\u003Cp\u003EYou have to add an authentication engine. \u00a0No, really. \u00a0There\u0027s a sasl_passwd file, but that\u0027s not enough. \u00a0You have linux accounts, but that\u0027s not enough either. \u00a0You need a separate engine to handle the actual smtp sasl authentication. \u00a0Starting to sound like gibberish? \u00a0That\u0027s ok, I don\u0027t really know what any of this means, I just know that when I followed a few tutorials and banged at it for a few hours, it ended up working.\u003C\/p\u003E\u003Cp\u003E\u003Ciframe allowfullscreen=\u0022\u0022 frameborder=\u00220\u0022 height=\u0022315\u0022 src=\u0022https:\/\/www.youtube.com\/embed\/KeFoGo3N_4g\u0022 width=\u0022420\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\u003Cp\u003EAnyway, yeah. \u00a0\u003Ca href=\u0022https:\/\/samhobbs.co.uk\/2013\/12\/raspberry-pi-email-server-part-2-dovecot\u0022\u003EYou need Dovecot\u003C\/a\u003E.\u003C\/p\u003E\u003Ch3\u003EConclusion\u003C\/h3\u003E\u003Cp\u003EIt wasn\u0027t really that bad. \u00a0If i had to do it again, I could do it pretty quickly and easily using these tutorials:\u003C\/p\u003E\u003Cp\u003Ehttps:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-setup-postfix-on-ubuntu-14-04\u003C\/p\u003E\u003Cp\u003Ehttps:\/\/www.howtoforge.com\/community\/threads\/postfix-user-unknown-in-virtual-alias-table.66602\/\u003C\/p\u003E\u003Cp\u003Ehttps:\/\/samhobbs.co.uk\/2013\/12\/raspberry-pi-email-server-part-2-dovecot\u003C\/p\u003E\u003Cp\u003EThe painful part was the trial and error, setting up something I knew nothing about, and which was\u00a0\u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/why-you-may-not-want-to-run-your-own-mail-server\u0022\u003Ea dubious idea in the first place\u003C\/a\u003E. \u00a0But it worked, and I\u0027m going to bed.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ESo, I made the leap from\u0026nbsp;\u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003Eshared hosting\u003C\/a\u003E\u0026nbsp;to a\u0026nbsp;\u003Ca href=\u0022https:\/\/www.digitalocean.com\/\u0022\u003Evirtual private server\u003C\/a\u003E. \u0026nbsp;Why? \u0026nbsp;A few reasons:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EYou\u0027ll never get great performance from shared hosting\u003C\/li\u003E\n\u003Cli\u003EI\u0027ve gained confidence in my own ability to devops\u003C\/li\u003E\n\u003Cli\u003EI\u0027m trying to improve my skill set\u003C\/li\u003E\n\u003Cli\u003EIt\u0027s\u0026nbsp;actually cheaper; $7\/mo for Hostgator shared hosting vs. $5\/mo for Digital Ocean\u003C\/li\u003E\n\u003Cli\u003EIt\u0027s fun! \u0026nbsp;(I need to get out more.)\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EMy first reaction?\u003C\/p\u003E\n\u003Cp\u003E\u003Ciframe allowfullscreen frameborder=\u00220\u0022 height=\u0022315\u0022 src=\u0022https:\/\/www.youtube.com\/embed\/g2O7rZTBs7w\u0022 width=\u0022560\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\n\u003Cp\u003ENot even kidding. \u0026nbsp;It was literally as fun as flying an alien spaceship out of a secret government facility with Jeff Goldblum. \u0026nbsp;Why?\u003C\/p\u003E\n\u003Cp\u003ESimply put: I can do cool stuff now. \u0026nbsp;Varnish. \u0026nbsp;Memcached. \u0026nbsp;New Relic. \u0026nbsp;Control my own environment, including resources and firewall. \u0026nbsp;If I want I can double my resources for $10\/mo, but I won\u0027t need to. \u0026nbsp;I\u0027m hosting 8 websites off a single server, and\u0026nbsp;every single one of them screams.\u0026nbsp;\u0026nbsp;Here\u0027s a quote from an actual client:\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cp\u003E\u003Cstrong\u003EIT\u2019S FANTASTIC! You\u2019re right; much, much faster. \u0026nbsp;In fact, instant!!!!! \u0026nbsp; \u0026nbsp;THANK YOU!\u003C\/strong\u003E\u003C\/p\u003E\u003C\/blockquote\u003E\n\u003Cdiv\u003EOf course, it\u0027s got its challenges. \u0026nbsp;The biggest was mail. \u0026nbsp;I had lots of mail forwarders set up, and several domains use Google Apps. \u0026nbsp;Now I need to figure out how to manage all those myself.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EThe answer: postfix. \u0026nbsp;Well, there are multiple answers, of course, but postfix seems to be popular for being simple. \u0026nbsp;Of course it\u0027s not really that simple. \u0026nbsp;First you have to set up the postfix daemon itself, with text-only configuration files. \u0026nbsp;Then you have to set up an authentication engine. \u0026nbsp;I chose dovecot because it had the clearest \u0022howto.\u0022 \u0026nbsp;Plus several hours of banging my head against a wall. \u0026nbsp;Literally. \u0026nbsp;(Turns out the banging didn\u0027t help.)\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ESo, how to do it? \u0026nbsp;Here\u0027s how:\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Ch2\u003EHow to Set Up Mail Forwarding on a VPS\u003C\/h2\u003E\n\u003Cp\u003EFirst, what this isn\u0027t: This isn\u0027t a full-fledged mail server. \u0026nbsp;No POP3, no IMAP. \u0026nbsp;No local storage of emails. \u0026nbsp;No spam filtering, no antivirus. \u0026nbsp;All my forwards are going to gmail, which already has excellent spam filtering and antivirus. \u0026nbsp;Maybe one day when I\u0027m bored I\u0027ll add these things, but honestly at this point I\u0027m afraid to\u0026nbsp;sneeze\u0026nbsp;at the server. \u0026nbsp;This feeling will pass. \u0026nbsp;Give me 24 hours and I\u0027m sure I\u0027ll be messing with it in ways that would make Marilyn Manson say \u0022dude, tone it down.\u0022\u003C\/p\u003E\n\u003Cp\u003EThis is a mail forwarder. \u0026nbsp;It\u0027s also an SMTP server; I can send emails from my virtual domains, eg. \u003Ca href=\u0022mailto:me@mydomain.com\u0022\u003Eme@mydomain.com\u003C\/a\u003E. \u0026nbsp;The trick is making sure the spammers don\u0027t get in; I made that mistake back in 2003, when I was running an IIS server out of my apartment. \u0026nbsp;Good times.\u003C\/p\u003E\n\u003Cp\u003EOK, so how did I stumble into success?\u003C\/p\u003E\n\u003Ch3\u003EInstall Postfix\u003C\/h3\u003E\n\u003Cp\u003ERead\u0026nbsp;\u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-configure-postfix-on-ubuntu-14-04\u0022\u003Ethis excellent tutorial from Digital Ocean\u003C\/a\u003E. \u0026nbsp;Turns out Digital Ocean is really cool like that. \u0026nbsp;They don\u0027t just hand you the keys to the porsche (although they do that); they also hand you a map and driving directions to the nearest gas station and the freeway. \u0026nbsp;In this case, they had a tutorial for the specific operating system I was using.\u003C\/p\u003E\n\u003Cp\u003EShort version: install the daemon using apt-get. \u0026nbsp;Edit the text-only configuration file. \u0026nbsp;Restart the daemon.\u003C\/p\u003E\n\u003Ch3\u003EAdd virtual aliases\u003C\/h3\u003E\n\u003Cp\u003ETurns out it doesn\u0027t matter if you\u0027ve already edited your MX records to point to Google Apps. \u0026nbsp;The mail request still goes through postfix first. \u0026nbsp;So you need a \u0022virtual\u0022 file where you list your aliases. \u0026nbsp;Eg. \u003Ca href=\u0022mailto:special@mydomain.com\u0022\u003Especial@mydomain.com\u003C\/a\u003E forwards to \u003Ca href=\u0022mailto:regular@gmail.com\u0022\u003Eregular@gmail.com\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003ETip: You have to\u0026nbsp;\u003Ca href=\u0022https:\/\/forum.howtoforge.com\/threads\/postfix-user-unknown-in-virtual-alias-table.66602\/\u0022\u003Eload your \u0022virtual\u0022 file into postfix\u003C\/a\u003E\u0026nbsp;after you edit, and then restart the postfix daemon again.\u003C\/p\u003E\n\u003Ch3\u003EAdd Dovecot\u003C\/h3\u003E\n\u003Cp\u003EYou have to add an authentication engine. \u0026nbsp;No, really. \u0026nbsp;There\u0027s a sasl_passwd file, but that\u0027s not enough. \u0026nbsp;You have linux accounts, but that\u0027s not enough either. \u0026nbsp;You need a separate engine to handle the actual smtp sasl authentication. \u0026nbsp;Starting to sound like gibberish? \u0026nbsp;That\u0027s ok, I don\u0027t really know what any of this means, I just know that when I followed a few tutorials and banged at it for a few hours, it ended up working.\u003C\/p\u003E\n\u003Cp\u003E\u003Ciframe allowfullscreen frameborder=\u00220\u0022 height=\u0022315\u0022 src=\u0022https:\/\/www.youtube.com\/embed\/KeFoGo3N_4g\u0022 width=\u0022420\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\n\u003Cp\u003EAnyway, yeah. \u0026nbsp;\u003Ca href=\u0022https:\/\/samhobbs.co.uk\/2013\/12\/raspberry-pi-email-server-part-2-dovecot\u0022\u003EYou need Dovecot\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ch3\u003EConclusion\u003C\/h3\u003E\n\u003Cp\u003EIt wasn\u0027t really that bad. \u0026nbsp;If i had to do it again, I could do it pretty quickly and easily using these tutorials:\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-setup-postfix-on-ubuntu-14-04\u0022\u003Ehttps:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-set\u2026\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.howtoforge.com\/community\/threads\/postfix-user-unknown-in-virtual-alias-table.66602\/\u0022\u003Ehttps:\/\/www.howtoforge.com\/community\/threads\/postfix-user-unknown-in-vi\u2026\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/samhobbs.co.uk\/2013\/12\/raspberry-pi-email-server-part-2-dovecot\u0022\u003Ehttps:\/\/samhobbs.co.uk\/2013\/12\/raspberry-pi-email-server-part-2-dovecot\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EThe painful part was the trial and error, setting up something I knew nothing about, and which was\u0026nbsp;\u003Ca href=\u0022https:\/\/www.digitalocean.com\/community\/tutorials\/why-you-may-not-want-to-run-your-own-mail-server\u0022\u003Ea dubious idea in the first place\u003C\/a\u003E. \u0026nbsp;But it worked, and I\u0027m going to bed.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1422864201,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":49}],"uuid":[{"value":"9a44abe4-e281-4bf8-a29c-ea36952c251f"}],"vid":[{"value":49}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2014-08-03T02:28:06+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Tenuki Design"}],"created":[{"value":"2014-08-03T01:58:14+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2014-08-03T02:28:06+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/tenuki-design","pid":83,"langcode":"und"}],"body":[{"value":"\u003Ch2\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208184729.png\u0022\u003E\u003C\/h2\u003E\u003Ch2\u003ETenuki Design is now Koplowicz \u0026amp; Sons\u003C\/h2\u003E\u003Cp\u003EI\u0027m pleased to announce that Tenuki Design has rebranded as Koplowicz \u0026amp; Sons.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208185007.jpg\u0022 style=\u0022float: right; height: 128px; width: 200px;\u0022\u003ETenuki\u003C\/strong\u003E is a Japanese word and it refers to a strategy from the great board game \u003Cstrong\u003EGo\u003C\/strong\u003E, known as the \u0022Japanese chess.\u0022 \u0026nbsp;(Not to be confused with\u0026nbsp;\u003Cstrong\u003Etanuki\u003C\/strong\u003E, which is the Japanese racoon dog.) \u0026nbsp;When you are unable to make a good move or overcome your opponent, sometimes the best strategy is to do something completely different, and move to a completely different part of the board. \u0026nbsp;This is tenuki.\u003C\/p\u003E\u003Cp\u003EWhen I switched from legal practice to web design, I named my company Tenuki because I was doing something different. \u0026nbsp;(Yes, I\u0027m also a licensed attorney in the State of California. \u0026nbsp;Ogres are like onions.) \u0026nbsp;Tenuki best represented my business and what I was doing. \u0026nbsp;It also represented my passion for the game of Go.\u003C\/p\u003E\u003Cp\u003EWhen my second son was born, web design was no longer about doing something different. \u0026nbsp;Now it\u0027s about building a dynasty. \u0026nbsp;My sons can\u0027t help with web design yet, but hopefully one day they will.\u003C\/p\u003E\u003Cp\u003EIn the mean time, I welcome you to peruse Koplowicz \u0026amp; Sons. \u0026nbsp;All my old blog posts from Tenuki are now on Koplowicz \u0026amp; Sons. \u0026nbsp;I\u0027m not currently taking clients, but my blog has a wealth of information, both for Drupal in particular, and web design in general - including my advice to others who want to change professions. \u0026nbsp;(Hint: It\u0027s the second best thing I\u0027ve ever done.)\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208185532.png\u0022\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Ch2\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208184729.png\u0022\u003E\u003C\/h2\u003E\n\u003Ch2\u003ETenuki Design is now Koplowicz \u0026amp; Sons\u003C\/h2\u003E\n\u003Cp\u003EI\u0027m pleased to announce that Tenuki Design has rebranded as Koplowicz \u0026amp; Sons.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208185007.jpg\u0022 style=\u0022float: right; height: 128px; width: 200px;\u0022\u003ETenuki\u003C\/strong\u003E is a Japanese word and it refers to a strategy from the great board game \u003Cstrong\u003EGo\u003C\/strong\u003E, known as the \u0022Japanese chess.\u0022 \u0026nbsp;(Not to be confused with\u0026nbsp;\u003Cstrong\u003Etanuki\u003C\/strong\u003E, which is the Japanese racoon dog.) \u0026nbsp;When you are unable to make a good move or overcome your opponent, sometimes the best strategy is to do something completely different, and move to a completely different part of the board. \u0026nbsp;This is tenuki.\u003C\/p\u003E\n\u003Cp\u003EWhen I switched from legal practice to web design, I named my company Tenuki because I was doing something different. \u0026nbsp;(Yes, I\u0027m also a licensed attorney in the State of California. \u0026nbsp;Ogres are like onions.) \u0026nbsp;Tenuki best represented my business and what I was doing. \u0026nbsp;It also represented my passion for the game of Go.\u003C\/p\u003E\n\u003Cp\u003EWhen my second son was born, web design was no longer about doing something different. \u0026nbsp;Now it\u0027s about building a dynasty. \u0026nbsp;My sons can\u0027t help with web design yet, but hopefully one day they will.\u003C\/p\u003E\n\u003Cp\u003EIn the mean time, I welcome you to peruse Koplowicz \u0026amp; Sons. \u0026nbsp;All my old blog posts from Tenuki are now on Koplowicz \u0026amp; Sons. \u0026nbsp;I\u0027m not currently taking clients, but my blog has a wealth of information, both for Drupal in particular, and web design in general - including my advice to others who want to change professions. \u0026nbsp;(Hint: It\u0027s the second best thing I\u0027ve ever done.)\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140208185532.png\u0022\u003E\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":48}],"uuid":[{"value":"df5ef263-233b-4246-b3a9-fb33d7b17c66"}],"vid":[{"value":204}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Drupal 7 Clean URLs in Ubuntu"}],"created":[{"value":"2014-07-11T01:16:03+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/drupal-7-clean-urls-ubuntu","pid":82,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis is a problem I\u0027ve solved many times, but I keep forgetting to write it down. \u00a0The problem is: You install Drupal on a new Linux server running Ubuntu. \u00a0Clean urls don\u0027t work.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003ESolution: Actually, there are several. \u00a0This is my attempt to make it simple.\u003C\/p\u003E\u003Col\u003E\u003Cli\u003E\u003Cstrong\u003ELAMP:\u00a0\u003C\/strong\u003EMake sure you installed the lamp stack correctly. \u00a0Follow these instructions:\u00a0\u003Ca href=\u0022https:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u0022\u003Ehttps:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EInstall Drupal:\u003C\/strong\u003E\u00a0Make sure Drupal is installed correctly. \u00a0If you follow\u00a0\u003Ca href=\u0022https:\/\/www.drupal.org\/docs\/7\/configuring-clean-urls\/enable-clean-urls\u0022\u003Ethe official Drupal instructions\u003C\/a\u003E\u00a0for clean urls, most of them have to do with an .htaccess file not being set up correctly.\u00a0\u00a0D7 comes with an .htaccess file that already has most of the settings you need, so make sure it\u0027s there.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003Emod_rewrite:\u003C\/strong\u003E\u00a0Install the Apache rewrite module:\u00a0sudo\u00a0a2enmod rewrite\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EApache config:\u00a0\u003C\/strong\u003EModify the Apache config file. \u00a0On Ubuntu it\u0027s located at \/etc\/apache2\/apache2.conf . \u00a0Add the following:\u003Cbr \/\u003E\u0026lt;Directory \/var\/www\/\u0026gt;\u003Cbr \/\u003E\u003Cdiv\u003E\u00a0 \u00a0Options Indexes\u00a0FollowSymLinks\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0AllowOverride All\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0Require all granted\u003C\/div\u003E\u003Cdiv\u003E\u0026lt;\/Directory\u0026gt;\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003E\u0026lt;Directory \/var\/www\/html\u0026gt;\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0RewriteEngine on\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0RewriteBase \/\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0RewriteCond %{REQUEST_FILENAME} !-f\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0RewriteCond %{REQUEST_FILENAME} !-d\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]\u003C\/div\u003E\u003Cdiv\u003E\u00a0 \u00a0AllowOverride All\u003C\/div\u003E\u003Cdiv\u003E\u0026lt;\/Directory\u0026gt;\u003C\/div\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ERestart Apache:\u00a0\u003C\/strong\u003E\/etc\/init.d\/apache2 restart\u003C\/li\u003E\u003C\/ol\u003E\u003Cdiv\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat\u0027s it! \u00a0This has worked for years, all the way up to Ubuntu 14.04. \u00a0Does it work for you? \u00a0Leave a message in the comments.\u003C\/span\u003E\u003C\/div\u003E","format":"full_html","processed":"\u003Cp\u003EThis is a problem I\u0027ve solved many times, but I keep forgetting to write it down. \u0026nbsp;The problem is: You install Drupal on a new Linux server running Ubuntu. \u0026nbsp;Clean urls don\u0027t work.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003ESolution: Actually, there are several. \u0026nbsp;This is my attempt to make it simple.\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003ELAMP:\u0026nbsp;\u003C\/strong\u003EMake sure you installed the lamp stack correctly. \u0026nbsp;Follow these instructions:\u0026nbsp;\u003Ca href=\u0022https:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u0022\u003Ehttps:\/\/help.ubuntu.com\/community\/ApacheMySQLPHP\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EInstall Drupal:\u003C\/strong\u003E\u0026nbsp;Make sure Drupal is installed correctly. \u0026nbsp;If you follow\u0026nbsp;\u003Ca href=\u0022https:\/\/www.drupal.org\/docs\/7\/configuring-clean-urls\/enable-clean-urls\u0022\u003Ethe official Drupal instructions\u003C\/a\u003E\u0026nbsp;for clean urls, most of them have to do with an .htaccess file not being set up correctly.\u0026nbsp;\u0026nbsp;D7 comes with an .htaccess file that already has most of the settings you need, so make sure it\u0027s there.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003Emod_rewrite:\u003C\/strong\u003E\u0026nbsp;Install the Apache rewrite module:\u0026nbsp;sudo\u0026nbsp;a2enmod rewrite\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EApache config:\u0026nbsp;\u003C\/strong\u003EModify the Apache config file. \u0026nbsp;On Ubuntu it\u0027s located at \/etc\/apache2\/apache2.conf . \u0026nbsp;Add the following:\u003Cbr\u003E\u0026lt;Directory \/var\/www\/\u0026gt;\u003Cbr\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;Options Indexes\u0026nbsp;FollowSymLinks\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;AllowOverride All\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;Require all granted\u003C\/div\u003E\n\u003Cdiv\u003E\u0026lt;\/Directory\u0026gt;\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003E\u0026lt;Directory \/var\/www\/html\u0026gt;\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;RewriteEngine on\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;RewriteBase \/\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;RewriteCond %{REQUEST_FILENAME} !-f\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;RewriteCond %{REQUEST_FILENAME} !-d\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp; \u0026nbsp;AllowOverride All\u003C\/div\u003E\n\u003Cdiv\u003E\u0026lt;\/Directory\u0026gt;\u003C\/div\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003ERestart Apache:\u0026nbsp;\u003C\/strong\u003E\/etc\/init.d\/apache2 restart\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cdiv\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat\u0027s it! \u0026nbsp;This has worked for years, all the way up to Ubuntu 14.04. \u0026nbsp;Does it work for you? \u0026nbsp;Leave a message in the comments.\u003C\/span\u003E\u003C\/div\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1405042473,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":47}],"uuid":[{"value":"5d2ff617-4e35-4768-9b0a-c340d32e3826"}],"vid":[{"value":342}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-09-17T10:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Why Google is the Holy Grail"}],"created":[{"value":"2014-06-10T05:33:00+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-09-17T10:00:02+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/why-google-holy-grail","pid":81,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis is a rant about the best-constructed website on the internet: Google.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EThis is the part where you laugh. \u00a0\u0022Surely you must be joking,\u0022 you say. \u00a0\u0022They\u0027re so plain and boring. \u00a0They use Arial, \u003Ca href=\u0022https:\/\/www.marksimonson.com\/notebook\/view\/the-scourge-of-arial\u0022\u003Ewhich you hate\u003C\/a\u003E. \u00a0Besides, of course they\u0027re simple. \u00a0They only do one thing.\u0022\u003C\/p\u003E\u003Cp\u003ENope, no, doesn\u0027t matter, no, and no. \u00a0Google is a huge company that \u003Ca href=\u0022https:\/\/about.google\/intl\/en\/products\/\u0022\u003Edoes a million things\u003C\/a\u003E. \u00a0The fact that you think they\u0027re so simple is what makes them brilliant. \u00a0\u003Ca href=\u0022https:\/\/www.smithsonianmag.com\/arts-culture\/how-steve-jobs-love-of-simplicity-fueled-a-design-revolution-23868877\/\u0022\u003EJust like Apple\u003C\/a\u003E. \u00a0But how did they fool you? \u00a0Two very simple things.\u003C\/p\u003E\u003Ch2\u003EFocus On Your Primary\u003C\/h2\u003E\u003Cp\u003EEveryone knows what Google\u0027s primary business is:\u00a0\u003Cstrong\u003Esearch.\u003C\/strong\u003E \u00a0It\u0027s what 99% of their users come for, and it\u0027s 99% of their revenue. \u00a0So, they emphasize it. \u00a0It\u0027s not just front \u0026amp; center; it sits alone in a sea of white. \u00a0You could be excused for thinking it\u0027s the only thing on the page.\u003C\/p\u003E\u003Ch2\u003EMake It Easy\u003C\/h2\u003E\u003Cp\u003EI\u0027m not talking about search any more; I\u0027m talking about\u00a0\u003Cem\u003Eeverything else they do\u003C\/em\u003E. \u00a0From the home page of Google.com, you can get to almost every other service that Google provides,\u00a0\u003Cem\u003Ewith one or two clicks.\u003C\/em\u003E \u00a0I\u0027m talking about Gmail, of course, and Youtube, Google Maps, Google Play, Google Drive, and pretty much everything else. \u00a0Even web professionals and business have everything at their fingertips, including Adwords, Adsense, and Google Webmaster Tools. \u00a0\u003Cem\u003EOne or two clicks.\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EDon\u0027t believe me? \u00a0Here\u0027s a chart:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140906221802.jpg\u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003EThat might be hard to read. \u00a0Go ahead and \u003Ca href=\u0022http:\/\/www.google.com\/\u0022\u003Etry it out\u003C\/a\u003E.\u003C\/p\u003E\u003Ch2\u003EThe Holy Grail\u003C\/h2\u003E\u003Cp\u003EI call Google the Holy Grail because it\u0027s the ultimate achievement in web design. \u00a0This is true whether you\u0027re talking about design, layout, architecture, user interface (UI), or user experience (UX). \u00a0Google.com is an incredibly powerful, feature-rich website, boiled down to utter simplicity. \u00a0It\u0027s a level of enlightenment to which I have always striven, and which I have not yet attained. \u00a0But I\u0027ll keep trying.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E\/\/ rant over\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThis is a rant about the best-constructed website on the internet: Google.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EThis is the part where you laugh. \u0026nbsp;\u0022Surely you must be joking,\u0022 you say. \u0026nbsp;\u0022They\u0027re so plain and boring. \u0026nbsp;They use Arial, \u003Ca href=\u0022https:\/\/www.marksimonson.com\/notebook\/view\/the-scourge-of-arial\u0022\u003Ewhich you hate\u003C\/a\u003E. \u0026nbsp;Besides, of course they\u0027re simple. \u0026nbsp;They only do one thing.\u0022\u003C\/p\u003E\n\u003Cp\u003ENope, no, doesn\u0027t matter, no, and no. \u0026nbsp;Google is a huge company that \u003Ca href=\u0022https:\/\/about.google\/intl\/en\/products\/\u0022\u003Edoes a million things\u003C\/a\u003E. \u0026nbsp;The fact that you think they\u0027re so simple is what makes them brilliant. \u0026nbsp;\u003Ca href=\u0022https:\/\/www.smithsonianmag.com\/arts-culture\/how-steve-jobs-love-of-simplicity-fueled-a-design-revolution-23868877\/\u0022\u003EJust like Apple\u003C\/a\u003E. \u0026nbsp;But how did they fool you? \u0026nbsp;Two very simple things.\u003C\/p\u003E\n\u003Ch2\u003EFocus On Your Primary\u003C\/h2\u003E\n\u003Cp\u003EEveryone knows what Google\u0027s primary business is:\u0026nbsp;\u003Cstrong\u003Esearch.\u003C\/strong\u003E \u0026nbsp;It\u0027s what 99% of their users come for, and it\u0027s 99% of their revenue. \u0026nbsp;So, they emphasize it. \u0026nbsp;It\u0027s not just front \u0026amp; center; it sits alone in a sea of white. \u0026nbsp;You could be excused for thinking it\u0027s the only thing on the page.\u003C\/p\u003E\n\u003Ch2\u003EMake It Easy\u003C\/h2\u003E\n\u003Cp\u003EI\u0027m not talking about search any more; I\u0027m talking about\u0026nbsp;\u003Cem\u003Eeverything else they do\u003C\/em\u003E. \u0026nbsp;From the home page of Google.com, you can get to almost every other service that Google provides,\u0026nbsp;\u003Cem\u003Ewith one or two clicks.\u003C\/em\u003E \u0026nbsp;I\u0027m talking about Gmail, of course, and Youtube, Google Maps, Google Play, Google Drive, and pretty much everything else. \u0026nbsp;Even web professionals and business have everything at their fingertips, including Adwords, Adsense, and Google Webmaster Tools. \u0026nbsp;\u003Cem\u003EOne or two clicks.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EDon\u0027t believe me? \u0026nbsp;Here\u0027s a chart:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140906221802.jpg\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EThat might be hard to read. \u0026nbsp;Go ahead and \u003Ca href=\u0022http:\/\/www.google.com\/\u0022\u003Etry it out\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ch2\u003EThe Holy Grail\u003C\/h2\u003E\n\u003Cp\u003EI call Google the Holy Grail because it\u0027s the ultimate achievement in web design. \u0026nbsp;This is true whether you\u0027re talking about design, layout, architecture, user interface (UI), or user experience (UX). \u0026nbsp;Google.com is an incredibly powerful, feature-rich website, boiled down to utter simplicity. \u0026nbsp;It\u0027s a level of enlightenment to which I have always striven, and which I have not yet attained. \u0026nbsp;But I\u0027ll keep trying.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E\/\/ rant over\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1402378380,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":46}],"uuid":[{"value":"8a377d7a-15fb-47ed-9749-c27d9dd3c321"}],"vid":[{"value":318}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-12-11T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Picking a CMS"}],"created":[{"value":"2014-05-21T17:25:27+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-12-11T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/picking-cms","pid":80,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve received this question a lot lately so I thought I\u0027d put it on the blog. \u00a0The question is: Why is Drupal the best web app platform? \u00a0Here\u0027s the answer.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EThe truth is Drupal can never be everything to everyone. \u00a0I have friends who made a lot of money as Drupal devs and then decided to \u0022upgrade\u0022 to newer, flashier platforms like Python and Ruby on Rails. \u00a0I have other friends who are doing just fine with Java (yup, that\u0027s still around). \u00a0But here\u0027s why Drupal might be a good idea for you.\u003C\/p\u003E\u003Ch2\u003EWhy you\u0027d use a PHP CMS\u003C\/h2\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EThe engine is already written for you.\u00a0\u003C\/strong\u003E If you use java, you\u0027ll end up writing everything from scratch.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EA lot of plug-in features are already written for you.\u003C\/strong\u003E\u00a0 If you use a CMS written in another language, like Python or Ruby on Rails, you can get a basic CMS engine (like Django) but you\u0027ll end up writing all the actual functionality for your site.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ENote: Some people see that as a good thing; the argument is that if you build it all yourself, it will be leaner, faster, and easier to maintain.\u00a0 Those are all true, but you\u0027ll also end up doing a lot more work yourself to get to the same place.\u00a0 Also, open source communities like Drupal are really good about finding and fixing bugs and security flaws.\u00a0 If you use Drupal, you\u0027re benefiting from the efforts of 30,000 other engineers.\u00a0 In my opinion that actually gets better results than doing it yourself.\u00a0 It\u0027s also an advantage over closed-source solutions like Sharepoint, where security fixes are slow at best.\u003C\/p\u003E\u003Ch2\u003EWhy you\u0027d choose Drupal over the other PHP options\u003C\/h2\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EJoomla\u003C\/strong\u003E is a terrible program.\u00a0 I\u0027ve used it just enough to know better.\u00a0 The architecture is clunky and awkward, things that should be fast and easy are difficult and time-consuming, and most of the really good plugins cost money.\u00a0 Even though it\u0027s technically an open source project, the entire Joomla developer community has an attitude that seems contrary to open source.\u00a0 They\u0027re not as friendly and they don\u0027t like to share.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EWordpress\u003C\/strong\u003E is a phenomenal program, easier to use than Drupal, has wider market adoption, and there are way more Wordpress engineers than there are Drupal engineers.\u00a0 The conventional wisdom is that Drupal is more powerful, although I don\u0027t think Wordpress gets enough credit for what it can actually do.\u00a0 The truth is both Drupal and Wordpress are more than just content management systems; they are true web app platforms.\u00a0 I\u0027ve seen entertainment venues, e-commerce sites, and even major universities use Wordpress.\u003C\/li\u003E\u003Cli\u003EWordpress also has a large and friendly developer community and most of the really good plugins are free on Wordpress.org.\u00a0 It will be easy to find Wordpress engineers to help you.\u003C\/li\u003E\u003Cli\u003EThat said, \u003Cstrong\u003EDrupal\u0027s\u003C\/strong\u003E main advantage is \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/views\u0022\u003EViews\u003C\/a\u003E.\u00a0 Using that module, you can basically create your own database without a single line of custom code.\u00a0 That\u0027s incredibly powerful.\u00a0 You can slice and dice your data and display maps, tables, graphs, and galleries.\u00a0 Wordpress doesn\u0027t have anything that comes close.\u00a0 If you need to deal with a lot of data, you should use Drupal.\u003C\/li\u003E\u003Cli\u003EDrupal also has \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/\u0022\u003Ea large and active developer community\u003C\/a\u003E in San Francisco and the greater Bay Area.\u00a0 Some of the largest and best Drupal design firms in the country (if not the world) are located here in the Bay Area.\u00a0 Every year they host \u003Ca href=\u0022https:\/\/2014.badcamp.net\/\u0022\u003EBadcamp\u003C\/a\u003E, which is a four day conference dedicated to Drupal.\u00a0 It\u0027s free.\u003C\/li\u003E\u003Cli\u003EIn my opinion, Drupal is also a more marketable skill.\u00a0 The number of Drupal devs available does not currently meet demand, which is great for the developers.\u003C\/li\u003E\u003Cli\u003EFinally, I simply have more experience with Drupal which is why I prefer it to the other options.\u00a0 I can whip up a quick prototype in Drupal faster than I could do it with plain html.\u00a0 Wordpress is also an excellent platform, as long as it does everything you need.\u00a0 Just stay away from Joomla.\u00a0 Trust me on that one.\u00a0\u003C\/li\u003E\u003C\/ul\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve received this question a lot lately so I thought I\u0027d put it on the blog. \u0026nbsp;The question is: Why is Drupal the best web app platform? \u0026nbsp;Here\u0027s the answer.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EThe truth is Drupal can never be everything to everyone. \u0026nbsp;I have friends who made a lot of money as Drupal devs and then decided to \u0022upgrade\u0022 to newer, flashier platforms like Python and Ruby on Rails. \u0026nbsp;I have other friends who are doing just fine with Java (yup, that\u0027s still around). \u0026nbsp;But here\u0027s why Drupal might be a good idea for you.\u003C\/p\u003E\n\u003Ch2\u003EWhy you\u0027d use a PHP CMS\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EThe engine is already written for you.\u0026nbsp;\u003C\/strong\u003E If you use java, you\u0027ll end up writing everything from scratch.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EA lot of plug-in features are already written for you.\u003C\/strong\u003E\u0026nbsp; If you use a CMS written in another language, like Python or Ruby on Rails, you can get a basic CMS engine (like Django) but you\u0027ll end up writing all the actual functionality for your site.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ENote: Some people see that as a good thing; the argument is that if you build it all yourself, it will be leaner, faster, and easier to maintain.\u0026nbsp; Those are all true, but you\u0027ll also end up doing a lot more work yourself to get to the same place.\u0026nbsp; Also, open source communities like Drupal are really good about finding and fixing bugs and security flaws.\u0026nbsp; If you use Drupal, you\u0027re benefiting from the efforts of 30,000 other engineers.\u0026nbsp; In my opinion that actually gets better results than doing it yourself.\u0026nbsp; It\u0027s also an advantage over closed-source solutions like Sharepoint, where security fixes are slow at best.\u003C\/p\u003E\n\u003Ch2\u003EWhy you\u0027d choose Drupal over the other PHP options\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EJoomla\u003C\/strong\u003E is a terrible program.\u0026nbsp; I\u0027ve used it just enough to know better.\u0026nbsp; The architecture is clunky and awkward, things that should be fast and easy are difficult and time-consuming, and most of the really good plugins cost money.\u0026nbsp; Even though it\u0027s technically an open source project, the entire Joomla developer community has an attitude that seems contrary to open source.\u0026nbsp; They\u0027re not as friendly and they don\u0027t like to share.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EWordpress\u003C\/strong\u003E is a phenomenal program, easier to use than Drupal, has wider market adoption, and there are way more Wordpress engineers than there are Drupal engineers.\u0026nbsp; The conventional wisdom is that Drupal is more powerful, although I don\u0027t think Wordpress gets enough credit for what it can actually do.\u0026nbsp; The truth is both Drupal and Wordpress are more than just content management systems; they are true web app platforms.\u0026nbsp; I\u0027ve seen entertainment venues, e-commerce sites, and even major universities use Wordpress.\u003C\/li\u003E\n\u003Cli\u003EWordpress also has a large and friendly developer community and most of the really good plugins are free on Wordpress.org.\u0026nbsp; It will be easy to find Wordpress engineers to help you.\u003C\/li\u003E\n\u003Cli\u003EThat said, \u003Cstrong\u003EDrupal\u0027s\u003C\/strong\u003E main advantage is \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/views\u0022\u003EViews\u003C\/a\u003E.\u0026nbsp; Using that module, you can basically create your own database without a single line of custom code.\u0026nbsp; That\u0027s incredibly powerful.\u0026nbsp; You can slice and dice your data and display maps, tables, graphs, and galleries.\u0026nbsp; Wordpress doesn\u0027t have anything that comes close.\u0026nbsp; If you need to deal with a lot of data, you should use Drupal.\u003C\/li\u003E\n\u003Cli\u003EDrupal also has \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/\u0022\u003Ea large and active developer community\u003C\/a\u003E in San Francisco and the greater Bay Area.\u0026nbsp; Some of the largest and best Drupal design firms in the country (if not the world) are located here in the Bay Area.\u0026nbsp; Every year they host \u003Ca href=\u0022https:\/\/2014.badcamp.net\/\u0022\u003EBadcamp\u003C\/a\u003E, which is a four day conference dedicated to Drupal.\u0026nbsp; It\u0027s free.\u003C\/li\u003E\n\u003Cli\u003EIn my opinion, Drupal is also a more marketable skill.\u0026nbsp; The number of Drupal devs available does not currently meet demand, which is great for the developers.\u003C\/li\u003E\n\u003Cli\u003EFinally, I simply have more experience with Drupal which is why I prefer it to the other options.\u0026nbsp; I can whip up a quick prototype in Drupal faster than I could do it with plain html.\u0026nbsp; Wordpress is also an excellent platform, as long as it does everything you need.\u0026nbsp; Just stay away from Joomla.\u0026nbsp; Trust me on that one.\u0026nbsp;\u003C\/li\u003E\n\u003C\/ul\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1400693127,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":44}],"uuid":[{"value":"7c12f503-a793-44cf-bd3b-c1d69a35861c"}],"vid":[{"value":360}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2021-09-15T12:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Starting Up With a Website"}],"created":[{"value":"2014-01-01T23:08:03+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2021-09-15T12:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/starting-website","pid":78,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIf you\u0027re a startup or already running a small business, you need a website. \u00a0You know that already. \u00a0Here\u0027s a primer on how to do it right. \u00a0(Spoiler: It doesn\u0027t involve hiring me.)\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EPlease read this article before you start. \u00a0Don\u0027t save it until you\u0027re halfway through. \u00a0By then you will have sunk a lot of time into something that might not be very good, and you\u0027ll stick with it rather than starting over. \u00a0Be willing to accept sunk costs. \u00a0A website is supposed to be a living and breathing thing, and it is supposed to change over time. \u00a0Never be afraid to scrap it and start over.\u003C\/p\u003E\u003Ch2\u003EPick a Platform\u003C\/h2\u003E\u003Cp\u003EYikes, that sounds technical! \u00a0Maybe I should just hire someone. \u00a0Jordan, can I hire you?\u003C\/p\u003E\u003Cp\u003ENo. \u00a0Maybe I should back up a bit.\u003C\/p\u003E\u003Ch2\u003EDo It Yourself\u003C\/h2\u003E\u003Cp\u003E\u003Cstrong\u003EThis is important\u003C\/strong\u003E\u003Cstrong\u003E.\u003C\/strong\u003E \u00a0I want you to do as much as you can without hiring someone. \u00a0Here\u0027s why:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EControl your content.\u003C\/strong\u003E \u00a0Your website needs to have fresh, relevant content. \u00a0You need to post new content on a regular basis. \u00a0(Yes, it\u0027s hard. \u00a0You thought running your own business would be easy?) \u00a0The only way you\u0027re going to be able to control your content is if you\u0027re doing it yourself.\u003Cbr \/\u003EThe good news:\u00a0\u003Cem\u003EIt\u0027s easy.\u003C\/em\u003E \u00a0No, really! \u00a0This is what the \u0022new\u00a0post\u0022 screen looks like on Wordpress:\u003Cbr \/\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140101142835.png\u0022 \/\u003E\u003Cbr \/\u003EThat\u0027s not so bad, right? \u00a0Stop being such a baby and write your own damn news posts.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EYour website is your business.\u003C\/strong\u003E \u00a0If you\u0027re running a web-based business, then your website\u00a0\u003Cem\u003Eis\u003C\/em\u003E your business. \u00a0If you were a car mechanic, but you paid someone else to actually fix the cars, then it\u0027s not really your business any more, is it. \u00a0You might be the dude who paid the money, but you\u0027re not the one\u00a0\u003Cem\u003Eearning\u003C\/em\u003E the money. \u00a0If you can\u0027t earn your own money, then you\u0027re not in the right business.\u003Cbr \/\u003EOf course, that\u0027s not always true. \u00a0Just because you\u0027re a car mechanic doesn\u0027t mean you do body work; maybe you need to hire a specialist for that. \u00a0Web design can get tricky and maybe you need a specialist for certain parts. \u00a0Also, maybe your business isn\u0027t web based. \u00a0If you run a lighting shop in Arizona, and you have a real \u0022brick and mortar\u0022 store, maybe it\u0027s okay to hire someone else to do the website, especially if it\u0027s a simple \u0022brochure\u0022 style site.\u003Cbr \/\u003EBut if your website is central to your business strategy, then you should be responsible for it.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ECut costs.\u003C\/strong\u003E \u00a0You can\u0027t hire me because I have a full time job (as of January 2014). \u00a0I\u0027m also too expensive; my sites typically start at $10,000 and go up from there. \u00a0Yes, there are cheaper web designers. \u00a0Some are good and some aren\u0027t. \u00a0And I\u0027m not saying I\u0027m not worth the money - of course I am (if I were available).\u003Cbr \/\u003EBut you\u0027re a small business. \u00a0You know better than to spend $10,000 if you could just do it yourself. \u00a0As a startup, your most precious commodity is money; it\u0027s the thing you have the least of. \u00a0Your cheapest commodity is time; that\u0027s the thing you have the most of, and it\u0027s the thing you\u0027re most willing to spend. \u00a0Like I said, there might be parts that you need to hire a specialist for, but if you can do the majority yourself, you are going to save thousands of dollars. \u00a0So save yourself the money and spend your own time on the website.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EOkay, now that you\u0027re convinced, how do you build yourself a website?\u003C\/p\u003E\u003Ch2\u003EPick a Platform\u003C\/h2\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/wordpress.com\/\u0022\u003EWordpress\u003C\/a\u003E is probably your best bet. \u00a0Wordpress is a\u00a0\u003Cstrong\u003Econtent management system.\u003C\/strong\u003E \u00a0That means it takes care of all the hard parts for you: html and menus and whatnot. \u00a0All you need to do is write your content. \u00a0The software is free, and at Wordpress.com they will host it for you and help you register a domain name. \u00a0(Those parts cost money, but their prices are reasonable.)\u003C\/p\u003E\u003Cp\u003EPersonally I prefer a different content management system called Drupal. \u00a0Drupal is more powerful, but it\u0027s also harder to use, it\u0027s harder to find talented developers to help, and they will be more expensive. \u00a0There are other platforms, like Joomla and Django. \u00a0But they\u0027re either not as good, or harder to use, or both. \u00a0Wordpress is a simple system and you don\u0027t need to be a programmer to use it. \u00a0Everything is point and click.\u003C\/p\u003E\u003Ch2\u003ESocial Media Strategy\u003C\/h2\u003E\u003Cp\u003ESocial media is basically free advertising. \u00a0Decide where you want to be. \u00a0Obvious choices are Facebook and Twitter. \u00a0You should also consider Yelp, Foursquare, LinkedIn, Pinterest, Instagram, Flickr, Youtube, and Google+. \u00a0No need to go overboard; just pick the ones that make sense for you. \u00a0You can always add or remove later.\u003C\/p\u003E\u003Ch3\u003ECreate Once, Publish Everywhere\u003C\/h3\u003E\u003Cp\u003ECOPE takes all the pain out of those social media accounts you just signed up for. \u00a0The idea is you write a news post in one place, and it automatically gets sent to all your different social networks. \u00a0There are tools to help you do this. \u00a0The most popular one is \u003Ca href=\u0022https:\/\/www.hootsuite.com\/\u0022\u003EHootsuite\u003C\/a\u003E. \u00a0All of a sudden your new media empire seems a lot easier to manage.\u003C\/p\u003E\u003Ch2\u003EBuild It\u003C\/h2\u003E\u003Cp\u003EEnough talk. \u00a0Start building your site. \u00a0All you really need is a few basic pages and a news section (ie. a blog). \u00a0Here are some things you may want to add. \u00a0Feel free to hire experts to do these things:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EMultimedia (eg. photos \u0026amp; videos)\u003C\/li\u003E\u003Cli\u003EOnline store\u003C\/li\u003E\u003Cli\u003ECustom visual design - although Wordpress has a great selection of free designs; \u003Ca href=\u0022https:\/\/wordpress.org\/themes\/\u0022\u003Esee them\u003C\/a\u003E here.\u003C\/li\u003E\u003Cli\u003EResponsive design so it looks good on cell phones, ipads, etc.\u003C\/li\u003E\u003Cli\u003EEvent calendar\u003C\/li\u003E\u003Cli\u003EMap\u003C\/li\u003E\u003Cli\u003E\u0026amp;c.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EYou don\u0027t necessarily need to do any of those things. \u00a0You can also postpone some of these things. \u00a0Like any other aspect of your business, your website should get better over time. \u00a0Not everything needs to be done immediately. \u00a0Don\u0027t let the perfect be the enemy of the good. \u00a0Your priority is making money, not adding fancy gizmos to the website. \u00a0(Although if an online store is central to your business strategy, then maybe you should do that soon, or hire someone.)\u003C\/p\u003E\u003Ch2\u003EReach Out\u003C\/h2\u003E\u003Cp\u003EYou might be intimidated by some of this. \u00a0That\u0027s okay; running a small business takes a lot of courage. \u00a0But you know that already. \u00a0It\u0027s okay to hire someone for the really tricky bits. \u00a0Also, you\u0027ll discover there\u0027s a large, friendly community of web designers, especially in tech-friendly places like the Bay Area. \u00a0You\u0027ll probably be able to find free events where you can go and ask for advice. \u00a0A good place to start is \u003Ca href=\u0022https:\/\/www.meetup.com\/\u0022\u003EMeetup.com\u003C\/a\u003E. \u00a0There are also great online help sites, like \u003Ca href=\u0022https:\/\/stackoverflow.com\/\u0022\u003EStack Overflow\u003C\/a\u003E. \u00a0Chances are someone else already had the same exact question, and the answer is already there. \u00a0Don\u0027t hesitate to reach out to the community, online and offline.\u003C\/p\u003E\u003Ch2\u003EConclusion\u003C\/h2\u003E\u003Cp\u003EThat\u0027s it. \u00a0That\u0027s all you need to get started with a simple website for your business. \u00a0Of course it can get more complicated; just take a look at the rest of this blog for a hint of what else is possible. \u00a0But all you need is something simple to get started - just like the rest of your business. \u00a0By owning the product and the process, you\u0027ll put your business in a much better position for the future.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EIf you\u0027re a startup or already running a small business, you need a website. \u0026nbsp;You know that already. \u0026nbsp;Here\u0027s a primer on how to do it right. \u0026nbsp;(Spoiler: It doesn\u0027t involve hiring me.)\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EPlease read this article before you start. \u0026nbsp;Don\u0027t save it until you\u0027re halfway through. \u0026nbsp;By then you will have sunk a lot of time into something that might not be very good, and you\u0027ll stick with it rather than starting over. \u0026nbsp;Be willing to accept sunk costs. \u0026nbsp;A website is supposed to be a living and breathing thing, and it is supposed to change over time. \u0026nbsp;Never be afraid to scrap it and start over.\u003C\/p\u003E\n\u003Ch2\u003EPick a Platform\u003C\/h2\u003E\n\u003Cp\u003EYikes, that sounds technical! \u0026nbsp;Maybe I should just hire someone. \u0026nbsp;Jordan, can I hire you?\u003C\/p\u003E\n\u003Cp\u003ENo. \u0026nbsp;Maybe I should back up a bit.\u003C\/p\u003E\n\u003Ch2\u003EDo It Yourself\u003C\/h2\u003E\n\u003Cp\u003E\u003Cstrong\u003EThis is important\u003C\/strong\u003E\u003Cstrong\u003E.\u003C\/strong\u003E \u0026nbsp;I want you to do as much as you can without hiring someone. \u0026nbsp;Here\u0027s why:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EControl your content.\u003C\/strong\u003E \u0026nbsp;Your website needs to have fresh, relevant content. \u0026nbsp;You need to post new content on a regular basis. \u0026nbsp;(Yes, it\u0027s hard. \u0026nbsp;You thought running your own business would be easy?) \u0026nbsp;The only way you\u0027re going to be able to control your content is if you\u0027re doing it yourself.\u003Cbr\u003EThe good news:\u0026nbsp;\u003Cem\u003EIt\u0027s easy.\u003C\/em\u003E \u0026nbsp;No, really! \u0026nbsp;This is what the \u0022new\u0026nbsp;post\u0022 screen looks like on Wordpress:\u003Cbr\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20140101142835.png\u0022\u003E\u003Cbr\u003EThat\u0027s not so bad, right? \u0026nbsp;Stop being such a baby and write your own damn news posts.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EYour website is your business.\u003C\/strong\u003E \u0026nbsp;If you\u0027re running a web-based business, then your website\u0026nbsp;\u003Cem\u003Eis\u003C\/em\u003E your business. \u0026nbsp;If you were a car mechanic, but you paid someone else to actually fix the cars, then it\u0027s not really your business any more, is it. \u0026nbsp;You might be the dude who paid the money, but you\u0027re not the one\u0026nbsp;\u003Cem\u003Eearning\u003C\/em\u003E the money. \u0026nbsp;If you can\u0027t earn your own money, then you\u0027re not in the right business.\u003Cbr\u003EOf course, that\u0027s not always true. \u0026nbsp;Just because you\u0027re a car mechanic doesn\u0027t mean you do body work; maybe you need to hire a specialist for that. \u0026nbsp;Web design can get tricky and maybe you need a specialist for certain parts. \u0026nbsp;Also, maybe your business isn\u0027t web based. \u0026nbsp;If you run a lighting shop in Arizona, and you have a real \u0022brick and mortar\u0022 store, maybe it\u0027s okay to hire someone else to do the website, especially if it\u0027s a simple \u0022brochure\u0022 style site.\u003Cbr\u003EBut if your website is central to your business strategy, then you should be responsible for it.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003ECut costs.\u003C\/strong\u003E \u0026nbsp;You can\u0027t hire me because I have a full time job (as of January 2014). \u0026nbsp;I\u0027m also too expensive; my sites typically start at $10,000 and go up from there. \u0026nbsp;Yes, there are cheaper web designers. \u0026nbsp;Some are good and some aren\u0027t. \u0026nbsp;And I\u0027m not saying I\u0027m not worth the money - of course I am (if I were available).\u003Cbr\u003EBut you\u0027re a small business. \u0026nbsp;You know better than to spend $10,000 if you could just do it yourself. \u0026nbsp;As a startup, your most precious commodity is money; it\u0027s the thing you have the least of. \u0026nbsp;Your cheapest commodity is time; that\u0027s the thing you have the most of, and it\u0027s the thing you\u0027re most willing to spend. \u0026nbsp;Like I said, there might be parts that you need to hire a specialist for, but if you can do the majority yourself, you are going to save thousands of dollars. \u0026nbsp;So save yourself the money and spend your own time on the website.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EOkay, now that you\u0027re convinced, how do you build yourself a website?\u003C\/p\u003E\n\u003Ch2\u003EPick a Platform\u003C\/h2\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/wordpress.com\/\u0022\u003EWordpress\u003C\/a\u003E is probably your best bet. \u0026nbsp;Wordpress is a\u0026nbsp;\u003Cstrong\u003Econtent management system.\u003C\/strong\u003E \u0026nbsp;That means it takes care of all the hard parts for you: html and menus and whatnot. \u0026nbsp;All you need to do is write your content. \u0026nbsp;The software is free, and at Wordpress.com they will host it for you and help you register a domain name. \u0026nbsp;(Those parts cost money, but their prices are reasonable.)\u003C\/p\u003E\n\u003Cp\u003EPersonally I prefer a different content management system called Drupal. \u0026nbsp;Drupal is more powerful, but it\u0027s also harder to use, it\u0027s harder to find talented developers to help, and they will be more expensive. \u0026nbsp;There are other platforms, like Joomla and Django. \u0026nbsp;But they\u0027re either not as good, or harder to use, or both. \u0026nbsp;Wordpress is a simple system and you don\u0027t need to be a programmer to use it. \u0026nbsp;Everything is point and click.\u003C\/p\u003E\n\u003Ch2\u003ESocial Media Strategy\u003C\/h2\u003E\n\u003Cp\u003ESocial media is basically free advertising. \u0026nbsp;Decide where you want to be. \u0026nbsp;Obvious choices are Facebook and Twitter. \u0026nbsp;You should also consider Yelp, Foursquare, LinkedIn, Pinterest, Instagram, Flickr, Youtube, and Google+. \u0026nbsp;No need to go overboard; just pick the ones that make sense for you. \u0026nbsp;You can always add or remove later.\u003C\/p\u003E\n\u003Ch3\u003ECreate Once, Publish Everywhere\u003C\/h3\u003E\n\u003Cp\u003ECOPE takes all the pain out of those social media accounts you just signed up for. \u0026nbsp;The idea is you write a news post in one place, and it automatically gets sent to all your different social networks. \u0026nbsp;There are tools to help you do this. \u0026nbsp;The most popular one is \u003Ca href=\u0022https:\/\/www.hootsuite.com\/\u0022\u003EHootsuite\u003C\/a\u003E. \u0026nbsp;All of a sudden your new media empire seems a lot easier to manage.\u003C\/p\u003E\n\u003Ch2\u003EBuild It\u003C\/h2\u003E\n\u003Cp\u003EEnough talk. \u0026nbsp;Start building your site. \u0026nbsp;All you really need is a few basic pages and a news section (ie. a blog). \u0026nbsp;Here are some things you may want to add. \u0026nbsp;Feel free to hire experts to do these things:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EMultimedia (eg. photos \u0026amp; videos)\u003C\/li\u003E\n\u003Cli\u003EOnline store\u003C\/li\u003E\n\u003Cli\u003ECustom visual design - although Wordpress has a great selection of free designs; \u003Ca href=\u0022https:\/\/wordpress.org\/themes\/\u0022\u003Esee them\u003C\/a\u003E here.\u003C\/li\u003E\n\u003Cli\u003EResponsive design so it looks good on cell phones, ipads, etc.\u003C\/li\u003E\n\u003Cli\u003EEvent calendar\u003C\/li\u003E\n\u003Cli\u003EMap\u003C\/li\u003E\n\u003Cli\u003E\u0026amp;c.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou don\u0027t necessarily need to do any of those things. \u0026nbsp;You can also postpone some of these things. \u0026nbsp;Like any other aspect of your business, your website should get better over time. \u0026nbsp;Not everything needs to be done immediately. \u0026nbsp;Don\u0027t let the perfect be the enemy of the good. \u0026nbsp;Your priority is making money, not adding fancy gizmos to the website. \u0026nbsp;(Although if an online store is central to your business strategy, then maybe you should do that soon, or hire someone.)\u003C\/p\u003E\n\u003Ch2\u003EReach Out\u003C\/h2\u003E\n\u003Cp\u003EYou might be intimidated by some of this. \u0026nbsp;That\u0027s okay; running a small business takes a lot of courage. \u0026nbsp;But you know that already. \u0026nbsp;It\u0027s okay to hire someone for the really tricky bits. \u0026nbsp;Also, you\u0027ll discover there\u0027s a large, friendly community of web designers, especially in tech-friendly places like the Bay Area. \u0026nbsp;You\u0027ll probably be able to find free events where you can go and ask for advice. \u0026nbsp;A good place to start is \u003Ca href=\u0022https:\/\/www.meetup.com\/\u0022\u003EMeetup.com\u003C\/a\u003E. \u0026nbsp;There are also great online help sites, like \u003Ca href=\u0022https:\/\/stackoverflow.com\/\u0022\u003EStack Overflow\u003C\/a\u003E. \u0026nbsp;Chances are someone else already had the same exact question, and the answer is already there. \u0026nbsp;Don\u0027t hesitate to reach out to the community, online and offline.\u003C\/p\u003E\n\u003Ch2\u003EConclusion\u003C\/h2\u003E\n\u003Cp\u003EThat\u0027s it. \u0026nbsp;That\u0027s all you need to get started with a simple website for your business. \u0026nbsp;Of course it can get more complicated; just take a look at the rest of this blog for a hint of what else is possible. \u0026nbsp;But all you need is something simple to get started - just like the rest of your business. \u0026nbsp;By owning the product and the process, you\u0027ll put your business in a much better position for the future.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1388617683,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":43}],"uuid":[{"value":"7551a790-26e5-46b1-b437-1c1603b95d0a"}],"vid":[{"value":366}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-03-30T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Open Source: Now NSA-Proof"}],"created":[{"value":"2013-12-05T05:57:14+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-03-30T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/open-source-now-nsa-proof","pid":77,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EA couple weeks ago, Linus Torvald\u0027s dad revealed that \u003Ca href=\u0022https:\/\/www.omgubuntu.co.uk\/2013\/11\/nsa-ask-linus-torvalds-include-backdoors-linux-father-says-yes?utm_source=feedly\u0022\u003Ethe NSA had asked his son to build vulnerabilities into Linux\u003C\/a\u003E, but his son had refused. \u00a0The article then points out that it wouldn\u0027t have worked anyway, because Linux is open source.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003EQuick primer: Open Source means that not only is the program free, but so is the source code. \u00a0That means you can take the code and make it your own and do whatever you want to it. \u00a0A good example is Google Chrome; it\u0027s actually based on the Chromium Project. \u00a0There\u0027s a whole operating system that\u0027s open source and it\u0027s called Linux. \u00a0Every web page you visit is hosted on a computer that runs Linux. \u00a0Linux was invented by a guy named Linus. \u00a0His dad gave an interview (see above).\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EFor me, the big revelation isn\u0027t that the NSA wanted to spy on something, because that\u0027s not really a revelation at this point. \u00a0The big revelation is that open source software is so secure, ambiguously malevolent government agencies couldn\u0027t spy on it if they wanted to. \u00a0That\u0027s not really a revelation; I\u0027ve been arguing for years that open source software is more secure than closed source software. \u00a0\u003Ca href=\u0022https:\/\/readwrite.com\/oracle-opens-both-barrels-on-open-source-software-in-military-whitepaper\/\u0022\u003EThe US military agrees\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EBut this point is new. \u00a0The Linux kernel has over 3700 individuals looking at it. \u00a0How is anyone going to sneak in a backdoor without anyone noticing? \u00a0(Of course, this also begs the question about closed source software like Microsoft Windows, who is answerable to no one.)\u003C\/p\u003E\u003Cp\u003EMeanwhile, my web development platform of choice is also open source. \u00a0I\u0027m talking, of course, about Ubuntu. \u00a0Just one more reason why open source is the better choice.\u003C\/p\u003E\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EA couple weeks ago, Linus Torvald\u0027s dad revealed that \u003Ca href=\u0022https:\/\/www.omgubuntu.co.uk\/2013\/11\/nsa-ask-linus-torvalds-include-backdoors-linux-father-says-yes?utm_source=feedly\u0022\u003Ethe NSA had asked his son to build vulnerabilities into Linux\u003C\/a\u003E, but his son had refused. \u0026nbsp;The article then points out that it wouldn\u0027t have worked anyway, because Linux is open source.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EQuick primer: Open Source means that not only is the program free, but so is the source code. \u0026nbsp;That means you can take the code and make it your own and do whatever you want to it. \u0026nbsp;A good example is Google Chrome; it\u0027s actually based on the Chromium Project. \u0026nbsp;There\u0027s a whole operating system that\u0027s open source and it\u0027s called Linux. \u0026nbsp;Every web page you visit is hosted on a computer that runs Linux. \u0026nbsp;Linux was invented by a guy named Linus. \u0026nbsp;His dad gave an interview (see above).\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EFor me, the big revelation isn\u0027t that the NSA wanted to spy on something, because that\u0027s not really a revelation at this point. \u0026nbsp;The big revelation is that open source software is so secure, ambiguously malevolent government agencies couldn\u0027t spy on it if they wanted to. \u0026nbsp;That\u0027s not really a revelation; I\u0027ve been arguing for years that open source software is more secure than closed source software. \u0026nbsp;\u003Ca href=\u0022https:\/\/readwrite.com\/oracle-opens-both-barrels-on-open-source-software-in-military-whitepaper\/\u0022\u003EThe US military agrees\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EBut this point is new. \u0026nbsp;The Linux kernel has over 3700 individuals looking at it. \u0026nbsp;How is anyone going to sneak in a backdoor without anyone noticing? \u0026nbsp;(Of course, this also begs the question about closed source software like Microsoft Windows, who is answerable to no one.)\u003C\/p\u003E\n\u003Cp\u003EMeanwhile, my web development platform of choice is also open source. \u0026nbsp;I\u0027m talking, of course, about Ubuntu. \u0026nbsp;Just one more reason why open source is the better choice.\u003C\/p\u003E\n\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1386223034,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":42}],"uuid":[{"value":"a2078aaf-d5cf-41c8-9796-6041d0db8f3a"}],"vid":[{"value":354}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2020-12-09T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Should Drupal Be Better?"}],"created":[{"value":"2013-11-13T05:01:26+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2020-12-09T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/should-drupal-be-better","pid":76,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI accidentally stepped into a flame war this morning.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EIt started with a \u003Ca href=\u0022https:\/\/www.bryanbraun.com\/2013\/11\/09\/if-gmail-were-built-with-drupal\/?utm_content=bufferd6344\u0026amp;amp;amp;amp;amp;amp;utm_source=buffer\u0026amp;amp;amp;amp;amp;amp;utm_medium=twitter\u0026amp;amp;amp;amp;amp;amp;utm_campaign=Buffer\u0022\u003Eblog post by Bryan Braun\u003C\/a\u003E, which made the point that Drupal\u0027s default backend interface is embarassingly bad.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003EFanboy disclaimer: I\u0027m actually a huge Drupal fan. \u00a0I could talk all day about why FOSS is always the best solution, and why Drupal is the best open source CMS. \u00a0I just \u003Ca href=\u0022http:\/\/2013.badcamp.net\/sessions\/case-study-airfield-management-sfo\u0022\u003Egave a talk at BADcamp\u003C\/a\u003E in which I argued that Drupal is much more than a CMS and is pretty much limitless as a web app platform. \u00a0That said, I think it\u0027s okay to admit shortcomings; this is a community-driven project. \u00a0But I\u0027m getting ahead of myself.\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EBryan is right, of course. \u00a0Drupal\u0027s backend interface does not hold up well compared to other modern web apps. \u00a0His blog post was \u003Ca href=\u0022https:\/\/twitter.com\/TheWeeklyDrop\/status\/400309781497659392\u0022\u003Etweeted by The Weekly Drop\u003C\/a\u003E, and favorited and retweeted multiple times after that, so it\u0027s easy to say I\u0027m not alone in my opinion. \u00a0But the article was criticized by Steve Purkiss:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20131211194516.png\u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003EAnd that\u0027s when I stepped in it.\u003C\/p\u003E\u003Cp\u003ESteve \u0026amp; I \u003Ca href=\u0022https:\/\/twitter.com\/stevepurkiss\/status\/400320891348721664\u0022\u003Eexchanged tweets for the next half hour\u003C\/a\u003E, and then Jeni Tehan decided to gang up on me too:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20131211194725.png\u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003EOh my goodness! \u00a0I shouldn\u0027t, but I will.\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u00a0\u00a0Let\u0027s break this down.\u003C\/span\u003E\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYou should customize the backend\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYes, this is true. \u00a0If your customer is (a) not technically profficient and (b) is expected to create their own content after you deliver the product, then it\u0027s a very good idea to customize the Drupal backend. \u00a0This isn\u0027t hard; the Drupal admin theme is as easy to customize as the front end theme, and there are already some excellent contrib themes at Drupal.org. \u00a0Prominent projects like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E have already done a fantastic job transforming the backend into something that is clean, modern, attractive, and friendly.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESteve also argued that customizing the back end isn\u0027t even that hard; you can do it with a premade \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/features\u0022\u003EFeature\u003C\/a\u003E that you reuse for every project. \u00a0He\u0027s right. \u00a0You could also use a fancy distro like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E, which has already done the work for you\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, and even Spark \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/spark\u0022\u003Ehas a D7 version\u003C\/a\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut in my opinion, that illustrates the problem: Drupal demands this level of work because the back end needs it\u003Ci\u003E.\u003C\/i\u003E \u00a0Wordpress\u0027 back end is very clean and easy compared to Drupal\u0027s, and doesn\u0027t need customization. \u00a0Yes, Drupal does way more than Wordpress, but we\u0027ll get into that later. \u00a0Drupal 8 does a much better job of the back end, which brings me to the next argument.\u003C\/span\u003E\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDrupal 8 will fix all this\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAlso true! \u00a0Personally, I\u0027m very excited about Drupal 8. \u00a0The backend is receiving a lot of love in the form of \u003Ca href=\u0022https:\/\/www.drupal.org\/community-initiatives\/previousinactive-initiatives\/spark-authoring-experience-in-drupal-8-core\u0022\u003ESpark\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/groups.drupal.org\/scotch\u0022\u003EScotch\u003C\/a\u003E. \u00a0(Even though Scotch didn\u0027t succeed at its initial goals, I believe it\u0027s still having impact.) \u00a0In fact, one could argue that the default back-end interface in D8 is \u0022good enough.\u0022 \u00a0Of course it\u0027s not Gmail, and maybe that wasn\u0027t a fair comparison in the first place. \u00a0Creating content in a CMS is probably more involved than writing an email, and demands more data. \u00a0And maybe the real issue here isn\u0027t the UI, but the UX, which is also the responsibility of the developer (or more broadly, the vendor). \u00a0I\u0027ve started to hear the term \u0022AX,\u0022 or \u0022Author Experience,\u0022 and I\u0027m glad that this is something that is being considered. \u00a0Using a website on the back end will always be different from using a website on the front end, and it raises different issues.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDoes a better Drupal 8 let D7 off the hook? \u00a0Arguably, yes. \u00a0Is D8 \u0022good enough?\u0022 \u00a0We don\u0027t even have a beta version yet so it\u0027s hard to say, but my gut feeling is yes.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut my point has more to do with the emphatic defense of D7. \u00a0It\u0027s okay to admit that a product has flaws. \u00a0That is, in fact, why we\u0027re working on a new version. \u00a0I have too much professional respect for Steve to accuse him of being a fanboy, but I don\u0027t think you do the product a service by defending something that\u0027s really a flaw. \u00a0D7 is still the best CMS on the market--\u003Cem\u003Eby far\u003C\/em\u003E--and yes, this flaw is easily correctable by a developer worth his salt.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut let\u0027s consider this from the standpoint of the larger market. \u00a0\u003Ca href=\u0022https:\/\/friendlymachine.net\/posts\/drupal-gains-market-share\u0022\u003EDrupal still lags behind Joomla in terms of market adoption\u003C\/a\u003E. \u00a0That\u0027s staggering; Joomla is a terrible product and it still has a larger market share than Drupal! \u00a0Why? \u00a0I don\u0027t really know, but a good guess would be marketing and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Network_effect\u0022\u003Ethe network effect\u003C\/a\u003E. \u00a0That\u0027s certainly the case with the closed-source content management systems; they succeed because corporations do a good job of selling them. \u00a0That\u0027s Drupal\u0027s competition.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EMy point: If we act like a bunch of fanboys and refuse to admit the shortcomings of our product, we\u0027re not going to do a good job of selling it. \u00a0I firmly believe that good salesmanship demands honesty.\u003C\/span\u003E\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYou can\u0027t be simultaneously simple and powerful\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis was Jeni\u0027s point, and it\u0027s a point that\u0027s been made by others: We shouldn\u0027t load Drupal down with every feature. \u00a0It should be clean and lean and flexible. \u00a0Let\u0027s \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/950956\u0022\u003Eget rid of things like Dashboard\u003C\/a\u003E, and give each\u00a0\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Edeveloper the ability to carve a back end that works for that project.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat\u0027s also true - Drupal is already a beast when it comes to performance, and we should do whatever we can to make that better, not worse. \u00a0But the argument falls short because every Drupal site still needs\u00a0\u003Cem\u003Esome sort\u003C\/em\u003E of back end. \u00a0And given that fact, I don\u0027t see any good reason why the back end shouldn\u0027t be beautiful.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI pointed out before that Wordpress\u0027 back end is much easier to use than Drupal\u0027s. \u00a0You could argue that\u0027s because Drupal is more powerful, b\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Eut frankly, that\u0027s a poor excuse. \u00a0Companies like Apple have made a name for themselves by offering products that are both powerful and easy to use. \u00a0This isn\u0027t a forum about the quality of Apple\u0027s design aesthetic, but the point is I reject the notion that we have to sacrifice beauty or ease of use for the sake of power.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ELet\u0027s unpack the Wordpress comparison a bit more. \u00a0Drupal fans love to claim that Wordpress is nothing more than a blogging platform. \u00a0That may have been true six years ago but it isn\u0027t really any more. \u00a0To give just a few examples: \u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/buddypress\/\u0022\u003EBuddyPress\u003C\/a\u003E turns WP into a full-fledged social network. \u00a0\u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/woocommerce\/\u0022\u003EWooCommerce\u003C\/a\u003E gives you a fully-featured online store. \u00a0\u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/advanced-custom-fields\/\u0022\u003EAdvanced Custom Fields\u003C\/a\u003E gives you the same power as CCK - still not as powerful as D7, but at this point we\u0027re very far from blog territory. \u00a0I could go on.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EEven without making that point, I could still point out that there are 27,000 plugins on Wordpress.org - that\u0027s more than the number of modules at Drupal.org. \u00a0Sure, a lot of them are related to blogging, but what happens if you install a couple dozen modules? \u00a0\u003Cstrong\u003EThe back end is still clean and simple.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAnd that\u0027s really my point, and I think Bryan\u0027s point too. \u00a0\u0022Drupal is powerful\u0022 is a poor excuse for Drupal being ugly. \u00a0And if D8 is already doing a better job (which I think it is), then that proves that it is possible for Drupal to do a better job.\u003C\/span\u003E\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESo what?\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYay, I won my argument. \u00a0But so what? \u00a0Especially if Steve already pointed out that what I want exists in D8, what\u0027s the point in talking about it? \u00a0What\u0027s the point in Bryan talking about it? \u00a0Well, there are several takeaways here.\u003C\/span\u003E\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThere\u0027s work to be done. \u00a0\u003C\/span\u003E\u003C\/strong\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBryan already answered this question better than I could. \u00a0He pointed out that there are lots of open tickets for Drupal core that have to do with usability, including \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/search\/drupal?assigned=\u0026amp;amp;submitted=\u0026amp;amp;participant=\u0026amp;amp;version%5B%5D=7.x\u0026amp;amp;issue_tags_op=%3D\u0026amp;amp;issue_tags=usability\u0022 style=\u0022line-height: 1.538em;\u0022\u003Emany for D7 that are still open\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003EThere\u0027s more work to be done.\u003C\/strong\u003E \u00a0Scotch isn\u0027t going to get into D8 core because not enough people helped. \u00a0Spark still has \u003Ca href=\u0022https:\/\/www.drupal.org\/community-initiatives\/previousinactive-initiatives\/spark-authoring-experience-in-drupal-8-core\u0022\u003Elots of open issues\u003C\/a\u003E. \u00a0You should help out.\u003C\/span\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003ELet\u0027s adopt D8.\u003C\/strong\u003E \u00a0There\u0027s been talk of developers leaving Drupal because they don\u0027t like the changes in D8. \u00a0In fact, that\u0027s the raison d\u0027etre for \u003Ca href=\u0022https:\/\/backdropcms.org\/\u0022\u003EBackdrop\u003C\/a\u003E. \u00a0The argument\u00a0in favor of D8 is that it\u0027s better. \u00a0I buy that argument, and this is a great example of why. \u00a0I can\u0027t wait to use a back end interface that\u0027s clean and attractive and doesn\u0027t require a lot of work before I ship.\u003C\/span\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EFinally, Bryan already answered this question. \u00a0He had the first word, and I\u0027ll let him have the last:\u003C\/span\u003E\u003C\/p\u003E\u003Cblockquote\u003E\u003Cp\u003EWe raise awareness. We explain that if Drupal is succeeding, it is despite its authoring experience, not because of it. We\u00a0\u003Ca href=\u0022http:\/\/bojhan.nl\/author-ux-known-problems\u0022\u003Eacknowledge the issues that exist\u003C\/a\u003E, and we\u00a0\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/search\/drupal?issue_tags=usability\u0022\u003Echip away at them in the core issue queues\u003C\/a\u003E\u00a0as much as we can. Then we celebrate every victory we have (three cheers for the\u00a0\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=mpNfenVOhtA\u0022\u003Eimproved installation interface\u003C\/a\u003E!).\u003C\/p\u003E\u003C\/blockquote\u003E\u003Cdiv\u003EI agree. \u00a0Drupal is already the best CMS on the planet, but that doesn\u0027t mean we shouldn\u0027t make it better.\u003C\/div\u003E","format":"full_html","processed":"\u003Cp\u003EI accidentally stepped into a flame war this morning.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EIt started with a \u003Ca href=\u0022https:\/\/www.bryanbraun.com\/2013\/11\/09\/if-gmail-were-built-with-drupal\/?utm_content=bufferd6344\u0026amp;amp;amp;amp;amp;amp;utm_source=buffer\u0026amp;amp;amp;amp;amp;amp;utm_medium=twitter\u0026amp;amp;amp;amp;amp;amp;utm_campaign=Buffer\u0022\u003Eblog post by Bryan Braun\u003C\/a\u003E, which made the point that Drupal\u0027s default backend interface is embarassingly bad.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EFanboy disclaimer: I\u0027m actually a huge Drupal fan. \u0026nbsp;I could talk all day about why FOSS is always the best solution, and why Drupal is the best open source CMS. \u0026nbsp;I just \u003Ca href=\u0022http:\/\/2013.badcamp.net\/sessions\/case-study-airfield-management-sfo\u0022\u003Egave a talk at BADcamp\u003C\/a\u003E in which I argued that Drupal is much more than a CMS and is pretty much limitless as a web app platform. \u0026nbsp;That said, I think it\u0027s okay to admit shortcomings; this is a community-driven project. \u0026nbsp;But I\u0027m getting ahead of myself.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EBryan is right, of course. \u0026nbsp;Drupal\u0027s backend interface does not hold up well compared to other modern web apps. \u0026nbsp;His blog post was \u003Ca href=\u0022https:\/\/twitter.com\/TheWeeklyDrop\/status\/400309781497659392\u0022\u003Etweeted by The Weekly Drop\u003C\/a\u003E, and favorited and retweeted multiple times after that, so it\u0027s easy to say I\u0027m not alone in my opinion. \u0026nbsp;But the article was criticized by Steve Purkiss:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20131211194516.png\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EAnd that\u0027s when I stepped in it.\u003C\/p\u003E\n\u003Cp\u003ESteve \u0026amp; I \u003Ca href=\u0022https:\/\/twitter.com\/stevepurkiss\/status\/400320891348721664\u0022\u003Eexchanged tweets for the next half hour\u003C\/a\u003E, and then Jeni Tehan decided to gang up on me too:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20131211194725.png\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EOh my goodness! \u0026nbsp;I shouldn\u0027t, but I will.\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u0026nbsp;\u0026nbsp;Let\u0027s break this down.\u003C\/span\u003E\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYou should customize the backend\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYes, this is true. \u0026nbsp;If your customer is (a) not technically profficient and (b) is expected to create their own content after you deliver the product, then it\u0027s a very good idea to customize the Drupal backend. \u0026nbsp;This isn\u0027t hard; the Drupal admin theme is as easy to customize as the front end theme, and there are already some excellent contrib themes at Drupal.org. \u0026nbsp;Prominent projects like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E have already done a fantastic job transforming the backend into something that is clean, modern, attractive, and friendly.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESteve also argued that customizing the back end isn\u0027t even that hard; you can do it with a premade \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/features\u0022\u003EFeature\u003C\/a\u003E that you reuse for every project. \u0026nbsp;He\u0027s right. \u0026nbsp;You could also use a fancy distro like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E, which has already done the work for you\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, and even Spark \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/spark\u0022\u003Ehas a D7 version\u003C\/a\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut in my opinion, that illustrates the problem: Drupal demands this level of work because the back end needs it\u003Ci\u003E.\u003C\/i\u003E \u0026nbsp;Wordpress\u0027 back end is very clean and easy compared to Drupal\u0027s, and doesn\u0027t need customization. \u0026nbsp;Yes, Drupal does way more than Wordpress, but we\u0027ll get into that later. \u0026nbsp;Drupal 8 does a much better job of the back end, which brings me to the next argument.\u003C\/span\u003E\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDrupal 8 will fix all this\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAlso true! \u0026nbsp;Personally, I\u0027m very excited about Drupal 8. \u0026nbsp;The backend is receiving a lot of love in the form of \u003Ca href=\u0022https:\/\/www.drupal.org\/community-initiatives\/previousinactive-initiatives\/spark-authoring-experience-in-drupal-8-core\u0022\u003ESpark\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/groups.drupal.org\/scotch\u0022\u003EScotch\u003C\/a\u003E. \u0026nbsp;(Even though Scotch didn\u0027t succeed at its initial goals, I believe it\u0027s still having impact.) \u0026nbsp;In fact, one could argue that the default back-end interface in D8 is \u0022good enough.\u0022 \u0026nbsp;Of course it\u0027s not Gmail, and maybe that wasn\u0027t a fair comparison in the first place. \u0026nbsp;Creating content in a CMS is probably more involved than writing an email, and demands more data. \u0026nbsp;And maybe the real issue here isn\u0027t the UI, but the UX, which is also the responsibility of the developer (or more broadly, the vendor). \u0026nbsp;I\u0027ve started to hear the term \u0022AX,\u0022 or \u0022Author Experience,\u0022 and I\u0027m glad that this is something that is being considered. \u0026nbsp;Using a website on the back end will always be different from using a website on the front end, and it raises different issues.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDoes a better Drupal 8 let D7 off the hook? \u0026nbsp;Arguably, yes. \u0026nbsp;Is D8 \u0022good enough?\u0022 \u0026nbsp;We don\u0027t even have a beta version yet so it\u0027s hard to say, but my gut feeling is yes.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut my point has more to do with the emphatic defense of D7. \u0026nbsp;It\u0027s okay to admit that a product has flaws. \u0026nbsp;That is, in fact, why we\u0027re working on a new version. \u0026nbsp;I have too much professional respect for Steve to accuse him of being a fanboy, but I don\u0027t think you do the product a service by defending something that\u0027s really a flaw. \u0026nbsp;D7 is still the best CMS on the market--\u003Cem\u003Eby far\u003C\/em\u003E--and yes, this flaw is easily correctable by a developer worth his salt.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut let\u0027s consider this from the standpoint of the larger market. \u0026nbsp;\u003Ca href=\u0022https:\/\/friendlymachine.net\/posts\/drupal-gains-market-share\u0022\u003EDrupal still lags behind Joomla in terms of market adoption\u003C\/a\u003E. \u0026nbsp;That\u0027s staggering; Joomla is a terrible product and it still has a larger market share than Drupal! \u0026nbsp;Why? \u0026nbsp;I don\u0027t really know, but a good guess would be marketing and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Network_effect\u0022\u003Ethe network effect\u003C\/a\u003E. \u0026nbsp;That\u0027s certainly the case with the closed-source content management systems; they succeed because corporations do a good job of selling them. \u0026nbsp;That\u0027s Drupal\u0027s competition.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EMy point: If we act like a bunch of fanboys and refuse to admit the shortcomings of our product, we\u0027re not going to do a good job of selling it. \u0026nbsp;I firmly believe that good salesmanship demands honesty.\u003C\/span\u003E\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYou can\u0027t be simultaneously simple and powerful\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis was Jeni\u0027s point, and it\u0027s a point that\u0027s been made by others: We shouldn\u0027t load Drupal down with every feature. \u0026nbsp;It should be clean and lean and flexible. \u0026nbsp;Let\u0027s \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/950956\u0022\u003Eget rid of things like Dashboard\u003C\/a\u003E, and give each\u0026nbsp;\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Edeveloper the ability to carve a back end that works for that project.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat\u0027s also true - Drupal is already a beast when it comes to performance, and we should do whatever we can to make that better, not worse. \u0026nbsp;But the argument falls short because every Drupal site still needs\u0026nbsp;\u003Cem\u003Esome sort\u003C\/em\u003E of back end. \u0026nbsp;And given that fact, I don\u0027t see any good reason why the back end shouldn\u0027t be beautiful.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI pointed out before that Wordpress\u0027 back end is much easier to use than Drupal\u0027s. \u0026nbsp;You could argue that\u0027s because Drupal is more powerful, b\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Eut frankly, that\u0027s a poor excuse. \u0026nbsp;Companies like Apple have made a name for themselves by offering products that are both powerful and easy to use. \u0026nbsp;This isn\u0027t a forum about the quality of Apple\u0027s design aesthetic, but the point is I reject the notion that we have to sacrifice beauty or ease of use for the sake of power.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ELet\u0027s unpack the Wordpress comparison a bit more. \u0026nbsp;Drupal fans love to claim that Wordpress is nothing more than a blogging platform. \u0026nbsp;That may have been true six years ago but it isn\u0027t really any more. \u0026nbsp;To give just a few examples: \u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/buddypress\/\u0022\u003EBuddyPress\u003C\/a\u003E turns WP into a full-fledged social network. \u0026nbsp;\u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/woocommerce\/\u0022\u003EWooCommerce\u003C\/a\u003E gives you a fully-featured online store. \u0026nbsp;\u003Ca href=\u0022https:\/\/wordpress.org\/plugins\/advanced-custom-fields\/\u0022\u003EAdvanced Custom Fields\u003C\/a\u003E gives you the same power as CCK - still not as powerful as D7, but at this point we\u0027re very far from blog territory. \u0026nbsp;I could go on.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EEven without making that point, I could still point out that there are 27,000 plugins on Wordpress.org - that\u0027s more than the number of modules at Drupal.org. \u0026nbsp;Sure, a lot of them are related to blogging, but what happens if you install a couple dozen modules? \u0026nbsp;\u003Cstrong\u003EThe back end is still clean and simple.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAnd that\u0027s really my point, and I think Bryan\u0027s point too. \u0026nbsp;\u0022Drupal is powerful\u0022 is a poor excuse for Drupal being ugly. \u0026nbsp;And if D8 is already doing a better job (which I think it is), then that proves that it is possible for Drupal to do a better job.\u003C\/span\u003E\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESo what?\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EYay, I won my argument. \u0026nbsp;But so what? \u0026nbsp;Especially if Steve already pointed out that what I want exists in D8, what\u0027s the point in talking about it? \u0026nbsp;What\u0027s the point in Bryan talking about it? \u0026nbsp;Well, there are several takeaways here.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThere\u0027s work to be done. \u0026nbsp;\u003C\/span\u003E\u003C\/strong\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBryan already answered this question better than I could. \u0026nbsp;He pointed out that there are lots of open tickets for Drupal core that have to do with usability, including \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/search\/drupal?assigned=\u0026amp;amp;submitted=\u0026amp;amp;participant=\u0026amp;amp;version%5B%5D=7.x\u0026amp;amp;issue_tags_op=%3D\u0026amp;amp;issue_tags=usability\u0022 style=\u0022line-height: 1.538em;\u0022\u003Emany for D7 that are still open\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003EThere\u0027s more work to be done.\u003C\/strong\u003E \u0026nbsp;Scotch isn\u0027t going to get into D8 core because not enough people helped. \u0026nbsp;Spark still has \u003Ca href=\u0022https:\/\/www.drupal.org\/community-initiatives\/previousinactive-initiatives\/spark-authoring-experience-in-drupal-8-core\u0022\u003Elots of open issues\u003C\/a\u003E. \u0026nbsp;You should help out.\u003C\/span\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003ELet\u0027s adopt D8.\u003C\/strong\u003E \u0026nbsp;There\u0027s been talk of developers leaving Drupal because they don\u0027t like the changes in D8. \u0026nbsp;In fact, that\u0027s the raison d\u0027etre for \u003Ca href=\u0022https:\/\/backdropcms.org\/\u0022\u003EBackdrop\u003C\/a\u003E. \u0026nbsp;The argument\u0026nbsp;in favor of D8 is that it\u0027s better. \u0026nbsp;I buy that argument, and this is a great example of why. \u0026nbsp;I can\u0027t wait to use a back end interface that\u0027s clean and attractive and doesn\u0027t require a lot of work before I ship.\u003C\/span\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EFinally, Bryan already answered this question. \u0026nbsp;He had the first word, and I\u0027ll let him have the last:\u003C\/span\u003E\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cp\u003EWe raise awareness. We explain that if Drupal is succeeding, it is despite its authoring experience, not because of it. We\u0026nbsp;\u003Ca href=\u0022http:\/\/bojhan.nl\/author-ux-known-problems\u0022\u003Eacknowledge the issues that exist\u003C\/a\u003E, and we\u0026nbsp;\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/search\/drupal?issue_tags=usability\u0022\u003Echip away at them in the core issue queues\u003C\/a\u003E\u0026nbsp;as much as we can. Then we celebrate every victory we have (three cheers for the\u0026nbsp;\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=mpNfenVOhtA\u0022\u003Eimproved installation interface\u003C\/a\u003E!).\u003C\/p\u003E\n\u003C\/blockquote\u003E\n\u003Cdiv\u003EI agree. \u0026nbsp;Drupal is already the best CMS on the planet, but that doesn\u0027t mean we shouldn\u0027t make it better.\u003C\/div\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1384318886,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":41}],"uuid":[{"value":"69957f4a-353e-457e-91d0-110de78bf1e0"}],"vid":[{"value":352}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2020-07-22T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Mobile First: I Don\u0027t Think It Means What You Think It Means"}],"created":[{"value":"2013-10-25T22:36:37+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2020-07-22T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/mobile-first-i-dont-think-it-means-what-you-think-it-means","pid":75,"langcode":"und"}],"body":[{"value":"\u003Cp\u003E\u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/10\/20\/rethinking-the-seductiveness-of-mobile-first\/\u0022\u003ESeveral \u003C\/a\u003E\u003Ca href=\u0022https:\/\/www.wired.com\/2013\/09\/designing-for-mobile-means-ditching-deeply-ingrained-pc-instincts\/\u0022\u003Erecent \u003C\/a\u003E\u003Ca href=\u0022https:\/\/semilshah.com\/2012\/08\/04\/mobile-first-not-so-fast\/\u0022\u003Earticles \u003C\/a\u003Ehave \u0022warned\u0022 against a \u0022mobile first\u0022 strategy, describing it as risky at best. \u00a0But, see, \u0022mobile first\u0022 isn\u0027t supposed to be a strategy. \u00a0It\u0027s supposed to be a tactic.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EHere\u0027s where my degree in Political Science comes out: there is a difference between strategy and tactics, and it\u0027s important that you know that. \u00a0Simply put:\u00a0\u003Cstrong\u003EStrategy\u003C\/strong\u003E is \u0022When I am hungry, I need to eat.\u0022 \u00a0The goal is to remain fed on a perpetual basis. \u00a0Sometimes other things are more important (like sleep), but you need to know\u00a0\u003Cem\u003Ewhen\u003C\/em\u003E food is the most important thing, and more importantly, you need to know that sometimes food is, in fact, the most important thing. \u00a0\u003Cstrong\u003ETactics\u003C\/strong\u003E is \u0022There\u0027s a McDonalds. \u00a0I\u0027ll eat there. \u00a0Then I won\u0027t be hungry any more.\u0022 \u00a0I\u0027m not saying that\u0027s a good tactic, but it will help you achieve your long term strategy. \u00a0Hitting the vending machine is a bad tactic because it won\u0027t help you achieve your strategy as effectively as a restaurant will.\u003C\/p\u003E\u003Cp\u003EPut another way:\u00a0\u003Cstrong\u003Estrategy\u003C\/strong\u003E is your long term goal;\u00a0\u003Cstrong\u003Etactics\u003C\/strong\u003E is how you achieve your strategy.\u003C\/p\u003E\u003Cp\u003EThere are a lot of articles praising \u0022mobile first,\u0022 and a lot of articles criticizing it, and it seems like they are talking past each other. \u00a0The \u003Ca href=\u0022https:\/\/copyblogger.com\/mobile-first\/\u0022\u003Earticles \u003C\/a\u003E\u003Ca href=\u0022https:\/\/designshack.net\/articles\/css\/mobilefirst\/\u0022\u003Ein favor\u003C\/a\u003E\u00a0all talk about mobile device adoption rates and how your viewers are likely to visit your site on a mobile device, and how it makes sense to build a mobile-friendly site first and then expand to a desktop-friendly layout. \u00a0\u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/10\/20\/rethinking-the-seductiveness-of-mobile-first\/\u0022\u003EThe \u003C\/a\u003E\u003Ca href=\u0022https:\/\/www.wired.com\/2013\/09\/designing-for-mobile-means-ditching-deeply-ingrained-pc-instincts\/\u0022\u003Earticles \u003C\/a\u003E\u003Ca href=\u0022https:\/\/semilshah.com\/2012\/08\/04\/mobile-first-not-so-fast\/\u0022\u003Eagainst \u003C\/a\u003Etalk about mobile applications. \u00a0That\u0027s not the same thing.\u003C\/p\u003E\u003Cp\u003EThe truth is: both sides are right. \u00a0You shouldn\u0027t start with a mobile app. \u00a0You should start with a website. \u00a0\u003Cem\u003EBut\u003C\/em\u003E\u003Cem\u003E that website should be designed mobile-first.\u003C\/em\u003E \u00a0A website is the only delivery method that is 100% cross platform. \u00a0Even your television can view it (probably). \u00a0But at the same time, if your website isn\u0027t mobile friendly, then you are intentionally denying yourself a whole swath of the marketplace. \u00a0And if your website is going to be mobile-friendly, it\u0027s a\u00a0\u003Cem\u003Emuch\u003C\/em\u003E better idea to design the mobile site first. \u00a0Trust me.\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EThat\u0027s what mobile first means\u003Cem\u003E.\u003C\/em\u003E\u003C\/strong\u003E \u00a0Build a website before an app, make sure your website is mobile friendly, and do that first.\u003C\/p\u003E\u003Cp\u003E\u003Cem style=\u0022line-height: 1.538em;\u0022\u003E(Unemployed in Greenland)\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003E\u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/10\/20\/rethinking-the-seductiveness-of-mobile-first\/\u0022\u003ESeveral \u003C\/a\u003E\u003Ca href=\u0022https:\/\/www.wired.com\/2013\/09\/designing-for-mobile-means-ditching-deeply-ingrained-pc-instincts\/\u0022\u003Erecent \u003C\/a\u003E\u003Ca href=\u0022https:\/\/semilshah.com\/2012\/08\/04\/mobile-first-not-so-fast\/\u0022\u003Earticles \u003C\/a\u003Ehave \u0022warned\u0022 against a \u0022mobile first\u0022 strategy, describing it as risky at best. \u0026nbsp;But, see, \u0022mobile first\u0022 isn\u0027t supposed to be a strategy. \u0026nbsp;It\u0027s supposed to be a tactic.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s where my degree in Political Science comes out: there is a difference between strategy and tactics, and it\u0027s important that you know that. \u0026nbsp;Simply put:\u0026nbsp;\u003Cstrong\u003EStrategy\u003C\/strong\u003E is \u0022When I am hungry, I need to eat.\u0022 \u0026nbsp;The goal is to remain fed on a perpetual basis. \u0026nbsp;Sometimes other things are more important (like sleep), but you need to know\u0026nbsp;\u003Cem\u003Ewhen\u003C\/em\u003E food is the most important thing, and more importantly, you need to know that sometimes food is, in fact, the most important thing. \u0026nbsp;\u003Cstrong\u003ETactics\u003C\/strong\u003E is \u0022There\u0027s a McDonalds. \u0026nbsp;I\u0027ll eat there. \u0026nbsp;Then I won\u0027t be hungry any more.\u0022 \u0026nbsp;I\u0027m not saying that\u0027s a good tactic, but it will help you achieve your long term strategy. \u0026nbsp;Hitting the vending machine is a bad tactic because it won\u0027t help you achieve your strategy as effectively as a restaurant will.\u003C\/p\u003E\n\u003Cp\u003EPut another way:\u0026nbsp;\u003Cstrong\u003Estrategy\u003C\/strong\u003E is your long term goal;\u0026nbsp;\u003Cstrong\u003Etactics\u003C\/strong\u003E is how you achieve your strategy.\u003C\/p\u003E\n\u003Cp\u003EThere are a lot of articles praising \u0022mobile first,\u0022 and a lot of articles criticizing it, and it seems like they are talking past each other. \u0026nbsp;The \u003Ca href=\u0022https:\/\/copyblogger.com\/mobile-first\/\u0022\u003Earticles \u003C\/a\u003E\u003Ca href=\u0022https:\/\/designshack.net\/articles\/css\/mobilefirst\/\u0022\u003Ein favor\u003C\/a\u003E\u0026nbsp;all talk about mobile device adoption rates and how your viewers are likely to visit your site on a mobile device, and how it makes sense to build a mobile-friendly site first and then expand to a desktop-friendly layout. \u0026nbsp;\u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/10\/20\/rethinking-the-seductiveness-of-mobile-first\/\u0022\u003EThe \u003C\/a\u003E\u003Ca href=\u0022https:\/\/www.wired.com\/2013\/09\/designing-for-mobile-means-ditching-deeply-ingrained-pc-instincts\/\u0022\u003Earticles \u003C\/a\u003E\u003Ca href=\u0022https:\/\/semilshah.com\/2012\/08\/04\/mobile-first-not-so-fast\/\u0022\u003Eagainst \u003C\/a\u003Etalk about mobile applications. \u0026nbsp;That\u0027s not the same thing.\u003C\/p\u003E\n\u003Cp\u003EThe truth is: both sides are right. \u0026nbsp;You shouldn\u0027t start with a mobile app. \u0026nbsp;You should start with a website. \u0026nbsp;\u003Cem\u003EBut\u003C\/em\u003E\u003Cem\u003E that website should be designed mobile-first.\u003C\/em\u003E \u0026nbsp;A website is the only delivery method that is 100% cross platform. \u0026nbsp;Even your television can view it (probably). \u0026nbsp;But at the same time, if your website isn\u0027t mobile friendly, then you are intentionally denying yourself a whole swath of the marketplace. \u0026nbsp;And if your website is going to be mobile-friendly, it\u0027s a\u0026nbsp;\u003Cem\u003Emuch\u003C\/em\u003E better idea to design the mobile site first. \u0026nbsp;Trust me.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EThat\u0027s what mobile first means\u003Cem\u003E.\u003C\/em\u003E\u003C\/strong\u003E \u0026nbsp;Build a website before an app, make sure your website is mobile friendly, and do that first.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem style=\u0022line-height: 1.538em;\u0022\u003E(Unemployed in Greenland)\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1382740597,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":40}],"uuid":[{"value":"96052967-d82c-4ca1-9507-b2aff9ea5652"}],"vid":[{"value":367}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-06-22T23:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Build a Wordpress style blog . . . in Drupal"}],"created":[{"value":"2013-10-22T18:08:14+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-06-22T23:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/build-wordpress-style-blog-drupal","pid":74,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ESteve Burge at OS Training just released an excellent article on \u003Ca href=\u0022https:\/\/ostraining.com\/blog\/drupal\/build-wordpress-in-drupal\/?utm_source=feedly\u0022\u003Ehow to make Drupal behave like a Wordpress blog\u003C\/a\u003E. \u00a0It\u0027s an excellent article and I recommend you read it. \u00a0It also shows what\u0027s both good and bad about Drupal.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EThe conventional wisdom holds several truths:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EIf you just want a blog, use Wordpress\u003C\/li\u003E\u003Cli\u003EIf you want something more powerful, use Drupal\u003C\/li\u003E\u003Cli\u003EDrupal is better than other powerful CMS platforms (like Django) because it saves you development time\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ESteve Burge\u0027s article seems to hint that you don\u0027t really need Wordpress, you can do the same thing in Drupal in just 92 easy steps (I counted). \u00a0That\u0027s true, but it belies Wordpress\u0027 very strength: in Wordpress, you can do all those things in\u00a0\u003Cem\u003Eone step\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAt the same time, there\u0027s been \u003Ca href=\u0022http:\/\/nerdsummit.org\/raising-bar-drupal-wscci-scotch-vodka-and-rum-1\u0022\u003Ea good deal of talk\u003C\/a\u003E in the Drupal community about ease of use, especially for content authoring. \u00a0\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly \u003C\/a\u003Ehas a node edit screen that looks an awful lot like Wordpress, and that\u0027s not an accident.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut here\u0027s the key point:\u00a0\u003Cstrong\u003ELooking like Wordpress is not the same thing as acting like Wordpress.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIt\u0027s true, Wordpress is much easier to use, on the front end and the back end. \u00a0It has some lovely features out of the box that Drupal does not. \u00a0It\u0027s also true that for some of these things, there is no excuse for Drupal not being easier or friendlier.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut it\u0027s also true that Drupal is much more extensible and configurable. \u00a0The simple fact that Drupal is more flexible means that its interface needs to be more open-ended. \u00a0If you need a \u0022recent posts\u0022 block on the side of your page, \u003Ca href=\u0022https:\/\/ostraining.com\/blog\/drupal\/build-wordpress-in-drupal\/?utm_source=feedly\u0022\u003Eyou are free to make one\u003C\/a\u003E. \u00a0If you need a custom database that displays the same information three different ways with Google Maps integration and a RESTful API, you can do that too - a lot easier than you could in Wordpress. \u00a0Drupal is in the habit of giving you excellent tools, not a finished product.\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI think that\u0027s a good thing. \u00a0I don\u0027t want my Drupal laden with a bunch of nifty little blog-friendly features that I won\u0027t ever use. \u00a0Concentrate on more powerful things like bringing Views into core. \u00a0If I need a blog, I\u0027ll use Wordpress with its preconfigured nifty little features. \u00a0If I need something more powerful, I will use the advanced tools that Drupal gives me.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat being said, I\u0027m still excited about the changes in Drupal 8 because a better user interface is always a good thing. \u00a0A modern PHP framework is always a good thing. \u00a0Object oriented programming is always a good thing. \u00a0Clean core code and a comprehensible API are always good things. \u00a0A learning curve is not a bad thing if you\u0027re a developer and you want to build something amazing.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EOf course you can make Drupal act like Wordpress. \u00a0You could make it work like Joomla too, or Django, or pretty much any platform out there. \u00a0That\u0027s the beauty of Drupal. \u00a0Steve Burge\u0027s article illustrated that point beautifully. \u00a0I\u0027m not going to start building blogs in Drupal, but it\u0027s nice to know I could.\u003C\/span\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ESteve Burge at OS Training just released an excellent article on \u003Ca href=\u0022https:\/\/ostraining.com\/blog\/drupal\/build-wordpress-in-drupal\/?utm_source=feedly\u0022\u003Ehow to make Drupal behave like a Wordpress blog\u003C\/a\u003E. \u0026nbsp;It\u0027s an excellent article and I recommend you read it. \u0026nbsp;It also shows what\u0027s both good and bad about Drupal.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EThe conventional wisdom holds several truths:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIf you just want a blog, use Wordpress\u003C\/li\u003E\n\u003Cli\u003EIf you want something more powerful, use Drupal\u003C\/li\u003E\n\u003Cli\u003EDrupal is better than other powerful CMS platforms (like Django) because it saves you development time\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ESteve Burge\u0027s article seems to hint that you don\u0027t really need Wordpress, you can do the same thing in Drupal in just 92 easy steps (I counted). \u0026nbsp;That\u0027s true, but it belies Wordpress\u0027 very strength: in Wordpress, you can do all those things in\u0026nbsp;\u003Cem\u003Eone step\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAt the same time, there\u0027s been \u003Ca href=\u0022http:\/\/nerdsummit.org\/raising-bar-drupal-wscci-scotch-vodka-and-rum-1\u0022\u003Ea good deal of talk\u003C\/a\u003E in the Drupal community about ease of use, especially for content authoring. \u0026nbsp;\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly \u003C\/a\u003Ehas a node edit screen that looks an awful lot like Wordpress, and that\u0027s not an accident.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut here\u0027s the key point:\u0026nbsp;\u003Cstrong\u003ELooking like Wordpress is not the same thing as acting like Wordpress.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIt\u0027s true, Wordpress is much easier to use, on the front end and the back end. \u0026nbsp;It has some lovely features out of the box that Drupal does not. \u0026nbsp;It\u0027s also true that for some of these things, there is no excuse for Drupal not being easier or friendlier.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut it\u0027s also true that Drupal is much more extensible and configurable. \u0026nbsp;The simple fact that Drupal is more flexible means that its interface needs to be more open-ended. \u0026nbsp;If you need a \u0022recent posts\u0022 block on the side of your page, \u003Ca href=\u0022https:\/\/ostraining.com\/blog\/drupal\/build-wordpress-in-drupal\/?utm_source=feedly\u0022\u003Eyou are free to make one\u003C\/a\u003E. \u0026nbsp;If you need a custom database that displays the same information three different ways with Google Maps integration and a RESTful API, you can do that too - a lot easier than you could in Wordpress. \u0026nbsp;Drupal is in the habit of giving you excellent tools, not a finished product.\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI think that\u0027s a good thing. \u0026nbsp;I don\u0027t want my Drupal laden with a bunch of nifty little blog-friendly features that I won\u0027t ever use. \u0026nbsp;Concentrate on more powerful things like bringing Views into core. \u0026nbsp;If I need a blog, I\u0027ll use Wordpress with its preconfigured nifty little features. \u0026nbsp;If I need something more powerful, I will use the advanced tools that Drupal gives me.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThat being said, I\u0027m still excited about the changes in Drupal 8 because a better user interface is always a good thing. \u0026nbsp;A modern PHP framework is always a good thing. \u0026nbsp;Object oriented programming is always a good thing. \u0026nbsp;Clean core code and a comprehensible API are always good things. \u0026nbsp;A learning curve is not a bad thing if you\u0027re a developer and you want to build something amazing.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EOf course you can make Drupal act like Wordpress. \u0026nbsp;You could make it work like Joomla too, or Django, or pretty much any platform out there. \u0026nbsp;That\u0027s the beauty of Drupal. \u0026nbsp;Steve Burge\u0027s article illustrated that point beautifully. \u0026nbsp;I\u0027m not going to start building blogs in Drupal, but it\u0027s nice to know I could.\u003C\/span\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1382465294,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":39}],"uuid":[{"value":"095c48dc-91fa-419e-9eb2-c2afbaa6abe0"}],"vid":[{"value":365}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-02-02T17:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Real Time Drupal Performance"}],"created":[{"value":"2013-10-22T01:19:41+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-02-02T17:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/real-time-drupal-performance","pid":73,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EAt work lately, I\u0027ve been dealing with an interesting problem: real time performance on a Drupal website. \u00a0It\u0027s interesting because the standard solutions don\u0027t work. \u00a0(This is a support page for an upcoming \u003Ca href=\u0022http:\/\/2013.badcamp.net\/sessions\/case-study-airfield-management-sfo\u0022\u003EBadcamp presentation\u003C\/a\u003E.)\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EStandard solutions include \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/memcache\u0022\u003EMemcache\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/varnish\u0022\u003EVarnish\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apachesolr\u0022\u003ESolr\u003C\/a\u003E, and \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/boost\u0022\u003EBoost\u003C\/a\u003E. \u00a0However, those all involve caching\u00a0\u003Cem\u003Econtent\u003C\/em\u003E, which we can\u0027t do here.\u003C\/p\u003E\u003Ch2\u003EMetrics\u003C\/h2\u003E\u003Cp\u003EFirst, let\u0027s gather some data about exactly what\u0027s responsible for slowing the site down. \u00a0Useful tools include:\u003C\/p\u003E\u003Cul\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/httpd.apache.org\/docs\/2.2\/programs\/ab.html\u0022\u003EApache Benchmark\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/newrelic.com\/\u0022\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENew Relic\u003C\/span\u003E\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/developer.yahoo.com\/yslow\/\u0022\u003EYSlow\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/developers.google.com\/speed\/\u0022\u003EGoogle Page Speed Insights\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp dir=\u0022ltr\u0022\u003EPlus there are some useful modules to collect more granular data:\u003C\/p\u003E\u003Cul\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/devel\u0022\u003EDevel module\u003C\/a\u003E memory usage\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/profiling\u0022\u003EProfiling module\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/performance\u0022\u003EPerformance module\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003Cli dir=\u0022ltr\u0022\u003E\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/xhprof\u0022\u003EXHProf\u003C\/a\u003E\u003C\/p\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Ch2 dir=\u0022ltr\u0022\u003EImprovements\u003C\/h2\u003E\u003Cp dir=\u0022ltr\u0022\u003ESo, what specific things can you do to improve performance, without caching content?\u003C\/p\u003E\u003Cul dir=\u0022ltr\u0022\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apc\u0022\u003EAPC\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003ERemove unused modules\u003C\/li\u003E\u003Cli\u003EMove javascript to the bottom of the page, CSS to the top\u003C\/li\u003E\u003Cli\u003ERemember to turn off your data-gathering modules once you have the information you need. \u00a0They\u0027ll make your performance MUCH worse if you leave them on.\u003C\/li\u003E\u003Cli\u003EBonus: Microcaching.\u00a0\u00a0Can\u0027t do it with a standard LAMP stack. \u00a0Need nginx.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ETo move js to the bottom of the page, add this code to your template.php or custom module:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003E\u0026#13;\n\u0026#13;\n\/**\u0026#13;\n * Implementaion of hook_js_alter()\u0026#13;\n * Override Glossy handling, new handling added by Jordan AIRS.\u0026#13;\n * Move most javascripts to bottom of page, but allow overrides to keep certain js in \u0026#13;\n *\/\u0026#13;\nfunction glossy_js_alter(\u0026amp;$javascript) {\u0026#13;\n  \/\/ Collect the scripts we want in to remain in the header scope.\u0026#13;\n  $header_scripts = array(\u0026#13;\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/timeline\/js\/timeline.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/scripts\/l10n\/en\/labellers.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-bundle.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-api.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-api.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-bundle.js\u0027,\u0026#13;\n    \u0027misc\/drupal.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/OpenLayers\/OpenLayers.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/js\/openlayers.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/layer_types\/openlayers_layer_type_xyz.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_attribution.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/modules\/openlayers_views\/plugins\/layer_types\/openlayers_views_vector.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_cluster.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_layerswitcher.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_navigation.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_panzoombar.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_popup.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/homebox\/homebox.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/homebox\/includes\/tipsy\/jquery.tipsy.js\u0027,\u0026#13;\n  );\u0026#13;\n \u0026#13;\n  \/\/ Change the default scope of all other scripts to footer.\u0026#13;\n  \/\/ We assume if the script is scoped to header it was done so by default.\u0026#13;\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\u0026#13;\n      if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\u0026#13;\n        $script[\u0027scope\u0027] = \u0027footer\u0027;\u0026#13;\n      }\u0026#13;\n    }\u0026#13;\n}\u0026#13;\n\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003E\u003C\/p\u003E\u003Ch2\u003EMysql improvements\u003C\/h2\u003E\u003Cp\u003EWith so much data and so many Views, a lot of the burden is on the database. \u00a0Here\u0027s a list of improvements specifically related to the database:\u003C\/p\u003E\u003Cul dir=\u0022ltr\u0022\u003E\u003Cli\u003EIndex mysql database columns\u003C\/li\u003E\u003Cli\u003EWhen possible, replace Rules php code with a mysql trigger\u003C\/li\u003E\u003Cli\u003EHost the sql database on a separate server\u003C\/li\u003E\u003Cli\u003EImprove RAM allocation to the mysql daemon\u003C\/li\u003E\u003Cli\u003EInstall a multi-core processor on the server so it can run Apache \u0026amp; mysql simultaneously\u003C\/li\u003E\u003Cli\u003EStore the databse on a faster hard drive: RAID array, SSD, RAM disk, etc.\u003C\/li\u003E\u003C\/ul\u003E\u003Ch2\u003EModules to improve performance\u003C\/h2\u003E\u003Cul dir=\u0022ltr\u0022\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/advagg\u0022\u003EAdvanced Aggregation\u003C\/a\u003E: Minify CSS \u0026amp; javascript and compress with gzip\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/css_emimage\u0022\u003ECSS Embedded Images\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/cdn\u0022\u003ECDN Module\u003C\/a\u003E: Parallel downloading of css \u0026amp; js\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EI didn\u0027t use these modules but you may find them useful:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/magic\u0022\u003EMagic module\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/core_library\u0022\u003ECore_library\u003C\/a\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Ch2\u003EBottom Line\u003C\/h2\u003E\u003Cp\u003E\u0022So, what should I use?\u0022 \u00a0The best answer is\u00a0\u003Cstrong\u003E\u003Cem\u003Etry everything.\u003C\/em\u003E\u003C\/strong\u003E \u00a0Everyone will have a slightly different solution that works best for them. \u00a0If you really want an optimal solution, you\u0027ll have to put in some effort to get there.\u003C\/p\u003E\u0026#13;\n\u003Ciframe src=\u0022https:\/\/docs.google.com\/presentation\/d\/1verQXB6-Yqgu3gE8Ui6Jy9a5ZaBHgfNOa5_njGA7Ujs\/embed?start=false\u0026amp;loop=false\u0026amp;delayms=3000\u0022 frameborder=\u00220\u0022 width=\u0022480\u0022 height=\u0022299\u0022 allowfullscreen=\u0022true\u0022 mozallowfullscreen=\u0022true\u0022 webkitallowfullscreen=\u0022true\u0022\u003E\u003C\/iframe\u003E","format":"raw_html","processed":"\u003Cp\u003EAt work lately, I\u0027ve been dealing with an interesting problem: real time performance on a Drupal website. \u0026nbsp;It\u0027s interesting because the standard solutions don\u0027t work. \u0026nbsp;(This is a support page for an upcoming \u003Ca href=\u0022http:\/\/2013.badcamp.net\/sessions\/case-study-airfield-management-sfo\u0022\u003EBadcamp presentation\u003C\/a\u003E.)\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EStandard solutions include \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/memcache\u0022\u003EMemcache\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/varnish\u0022\u003EVarnish\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apachesolr\u0022\u003ESolr\u003C\/a\u003E, and \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/boost\u0022\u003EBoost\u003C\/a\u003E. \u0026nbsp;However, those all involve caching\u0026nbsp;\u003Cem\u003Econtent\u003C\/em\u003E, which we can\u0027t do here.\u003C\/p\u003E\n\u003Ch2\u003EMetrics\u003C\/h2\u003E\n\u003Cp\u003EFirst, let\u0027s gather some data about exactly what\u0027s responsible for slowing the site down. \u0026nbsp;Useful tools include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/httpd.apache.org\/docs\/2.2\/programs\/ab.html\u0022\u003EApache Benchmark\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/newrelic.com\/\u0022\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENew Relic\u003C\/span\u003E\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/developer.yahoo.com\/yslow\/\u0022\u003EYSlow\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/developers.google.com\/speed\/\u0022\u003EGoogle Page Speed Insights\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp dir=\u0022ltr\u0022\u003EPlus there are some useful modules to collect more granular data:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/devel\u0022\u003EDevel module\u003C\/a\u003E memory usage\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/profiling\u0022\u003EProfiling module\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/performance\u0022\u003EPerformance module\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli dir=\u0022ltr\u0022\u003E\n\u003Cp dir=\u0022ltr\u0022\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/xhprof\u0022\u003EXHProf\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch2 dir=\u0022ltr\u0022\u003EImprovements\u003C\/h2\u003E\n\u003Cp dir=\u0022ltr\u0022\u003ESo, what specific things can you do to improve performance, without caching content?\u003C\/p\u003E\n\u003Cul dir=\u0022ltr\u0022\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apc\u0022\u003EAPC\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003ERemove unused modules\u003C\/li\u003E\n\u003Cli\u003EMove javascript to the bottom of the page, CSS to the top\u003C\/li\u003E\n\u003Cli\u003ERemember to turn off your data-gathering modules once you have the information you need. \u0026nbsp;They\u0027ll make your performance MUCH worse if you leave them on.\u003C\/li\u003E\n\u003Cli\u003EBonus: Microcaching.\u0026nbsp;\u0026nbsp;Can\u0027t do it with a standard LAMP stack. \u0026nbsp;Need nginx.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ETo move js to the bottom of the page, add this code to your template.php or custom module:\u003C\/p\u003E\n\u003Cp\u003E\n\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003E\n\n\/**\n * Implementaion of hook_js_alter()\n * Override Glossy handling, new handling added by Jordan AIRS.\n * Move most javascripts to bottom of page, but allow overrides to keep certain js in \n *\/\nfunction glossy_js_alter(\u0026amp;$javascript) {\n  \/\/ Collect the scripts we want in to remain in the header scope.\n  $header_scripts = array(\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\n    \u0027sites\/all\/modules\/timeline\/js\/timeline.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/scripts\/l10n\/en\/labellers.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-bundle.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-api.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-api.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-bundle.js\u0027,\n    \u0027misc\/drupal.js\u0027,\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\n    \u0027sites\/all\/libraries\/OpenLayers\/OpenLayers.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/js\/openlayers.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/layer_types\/openlayers_layer_type_xyz.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_attribution.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/modules\/openlayers_views\/plugins\/layer_types\/openlayers_views_vector.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_cluster.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_layerswitcher.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_navigation.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_panzoombar.js\u0027,\n    \u0027sites\/all\/modules\/openlayers\/plugins\/behaviors\/openlayers_behavior_popup.js\u0027,\n    \u0027sites\/all\/modules\/homebox\/homebox.js\u0027,\n    \u0027sites\/all\/modules\/homebox\/includes\/tipsy\/jquery.tipsy.js\u0027,\n  );\n \n  \/\/ Change the default scope of all other scripts to footer.\n  \/\/ We assume if the script is scoped to header it was done so by default.\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\n      if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\n        $script[\u0027scope\u0027] = \u0027footer\u0027;\n      }\n    }\n}\n\u003C\/pre\u003E\u003Cp\u003E\n\u003C\/p\u003E\n\u003Ch2\u003EMysql improvements\u003C\/h2\u003E\n\u003Cp\u003EWith so much data and so many Views, a lot of the burden is on the database. \u0026nbsp;Here\u0027s a list of improvements specifically related to the database:\u003C\/p\u003E\n\u003Cul dir=\u0022ltr\u0022\u003E\n\u003Cli\u003EIndex mysql database columns\u003C\/li\u003E\n\u003Cli\u003EWhen possible, replace Rules php code with a mysql trigger\u003C\/li\u003E\n\u003Cli\u003EHost the sql database on a separate server\u003C\/li\u003E\n\u003Cli\u003EImprove RAM allocation to the mysql daemon\u003C\/li\u003E\n\u003Cli\u003EInstall a multi-core processor on the server so it can run Apache \u0026amp; mysql simultaneously\u003C\/li\u003E\n\u003Cli\u003EStore the databse on a faster hard drive: RAID array, SSD, RAM disk, etc.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch2\u003EModules to improve performance\u003C\/h2\u003E\n\u003Cul dir=\u0022ltr\u0022\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/advagg\u0022\u003EAdvanced Aggregation\u003C\/a\u003E: Minify CSS \u0026amp; javascript and compress with gzip\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/css_emimage\u0022\u003ECSS Embedded Images\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/cdn\u0022\u003ECDN Module\u003C\/a\u003E: Parallel downloading of css \u0026amp; js\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EI didn\u0027t use these modules but you may find them useful:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/magic\u0022\u003EMagic module\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/core_library\u0022\u003ECore_library\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch2\u003EBottom Line\u003C\/h2\u003E\n\u003Cp\u003E\u0022So, what should I use?\u0022 \u0026nbsp;The best answer is\u0026nbsp;\u003Cstrong\u003E\u003Cem\u003Etry everything.\u003C\/em\u003E\u003C\/strong\u003E \u0026nbsp;Everyone will have a slightly different solution that works best for them. \u0026nbsp;If you really want an optimal solution, you\u0027ll have to put in some effort to get there.\u003C\/p\u003E\n\u003Cp\u003E\n\u003C\/p\u003E\n\u003Ciframe src=\u0022https:\/\/docs.google.com\/presentation\/d\/1verQXB6-Yqgu3gE8Ui6Jy9a5ZaBHgfNOa5_njGA7Ujs\/embed?start=false\u0026amp;loop=false\u0026amp;delayms=3000\u0022 frameborder=\u00220\u0022 width=\u0022480\u0022 height=\u0022299\u0022 allowfullscreen=\u0022true\u0022 mozallowfullscreen=\u0022true\u0022 webkitallowfullscreen=\u0022true\u0022\u003E\u003C\/iframe\u003E","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1382804569,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":37}],"uuid":[{"value":"a67a6837-358e-4fd3-9813-fbf6876975f1"}],"vid":[{"value":387}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2023-07-20T15:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Why I Don\u0027t Use Linux"}],"created":[{"value":"2013-09-09T05:08:29+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2023-07-20T15:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/why-i-dont-use-linux","pid":71,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIntel recently \u003Ca href=\u0022https:\/\/www.omgubuntu.co.uk\/2013\/09\/intel-remove-xmir-support-in-xorg-video-driver?utm_source=feedly\u0022\u003Eremoved Mir support\u003C\/a\u003E from its video drivers. \u00a0I could get into the politics behind it - and I will - but the larger point here is: this is why I don\u0027t use Linux.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EWell, actually I\u00a0\u003Cem\u003Edo\u003C\/em\u003E use Linux. \u00a0I\u0027ve been using Linux pretty much 100% of the time since 2005. \u00a0I made it through law school on Linux and have gotten friends and family to use it. \u00a0I even briefly practiced law on Linux. \u00a0(Writing briefs is hard but I found a way.)\u003C\/p\u003E\u003Cp\u003EBut when I started working at SFO, I had to switch back to Windows. \u00a0The rest of the office used Windows and I wanted my dev environment to be the same as theirs (never mind the fact that the web servers use Linux). \u00a0It\u0027s also hard to get 100% compatibility with Microsoft Outlook in an enterprise environment. \u00a0But the real sticking point for me was the video drivers. \u00a0See, I\u0027ve got three monitors at work, and they\u0027re all plugged into my laptop dock. \u00a0The graphics card is an Nvidia Optimus card - similar to the one on my home laptop, and I never got that to work perfectly either. \u00a0(Well enough to do dual monitor output with the Compiz spinny cube, but I can\u0027t tell you how many times I had to break Linux and reinstall it before I could get that to work.) \u00a0At work, I could get dual monitors to work, although it was sketchy. \u00a0As soon as I tried for triple monitors, it simply refused to start up. \u00a0I think the dock was part of the problem, but I can\u0027t plug in two external monitors to a laptop without the dock. \u00a0Sure, I could manage with two monitors instead of three, but intentionally crippling myself for Linux didn\u0027t seem worth it.\u003C\/p\u003E\u003Cp\u003EBesides, Windows support for web design isn\u0027t that bad. \u00a0Well, that\u0027s not true either - it\u0027s\u00a0\u003Cem\u003Eterrible\u003C\/em\u003E. \u00a0But I found it relatively easy to install all the tools I needed. \u00a0That\u0027s a topic for another blog post, but with \u003Ca href=\u0022https:\/\/www.axway.com\/en\u0022\u003EAptana\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/drush.ws\/drush_windows_installer\u0022\u003EDrush\u003C\/a\u003E,\u00a0and the \u003Ca href=\u0022https:\/\/www.acquia.com\/products\/acquia-cloud-platform\/cloud-ide\u0022\u003EAcquia Development Desktop\u003C\/a\u003E I\u0027m pretty much there.\u003C\/p\u003E\u003Cp\u003EThat\u0027s worth noting. \u00a0With those three apps, I get syntax highlighting, doxygen support, bash, drush, ssh with key support, git, and a full WAMP stack. \u00a0\u003Cem\u003EIn Windows.\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EOf course, I\u0027d still much rather be using Linux. \u00a0It\u0027s a much better OS for many reasons, and it\u0027s still a much better OS for web development. \u00a0I\u0027ve never seen a web design team that\u0027s all-Windows, and I probably never will again. \u00a0But hey, my monitors work.\u003C\/p\u003E\u003Cp\u003EAnd that\u0027s the real point there: graphics support. \u00a0For the last 10 years or so, hardware support on Linux has been \u003Cem\u003Eexcellent\u003C\/em\u003E. \u00a0Better than Windows, in fact, because pretty much all the drivers are pre-installed in the kernel. \u00a0On Windows you still have to install drivers with every piece of hardware you add, but Linux offers\u00a0\u003Cem\u003Etrue\u003C\/em\u003E plug-and-play.\u00a0\u003C\/p\u003E\u003Cp\u003ELately, however, it seems like the graphics card companies want to send Linux back to the dark ages. \u00a0NVidia still refuses to open source their drivers, which was okay when the open source community had pretty much reverse engineered everything, but now NVidia is coming out with baffling new hardware like Optimus that simply doesn\u0027t work in Linux. \u00a0They refuse to release Linux drivers for Linux and they refuse to let the community to do it either (with open source). \u00a0And now Intel has decided to screw us over by removing Mir support.\u003C\/p\u003E\u003Cp\u003EI understand there are politics involved; they\u0027ve been pushing Wayland and have even hired full time employees to write open-source code for Wayland, and I\u0027m sure they saw it as a slap in the face that Canonical decided to ignore all their hard work and support Mir instead. \u00a0Especially since Intel has, historically, been much friendlier to open source than any other graphics card manufacturer. \u00a0(Read: NVidia \u0026amp; Radeon.) \u00a0It does seem rather tone deaf for Canonical to make such a decision so unilaterally. \u00a0When you rely on alliances with large manufacturers, you should make sure you never piss them off. \u00a0Something like this should never be a surprise.\u003C\/p\u003E\u003Cp\u003EBottom line: I have to use Windows at work because Linux can\u0027t figure out how to run graphics cards. \u00a0In 2013.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EIntel recently \u003Ca href=\u0022https:\/\/www.omgubuntu.co.uk\/2013\/09\/intel-remove-xmir-support-in-xorg-video-driver?utm_source=feedly\u0022\u003Eremoved Mir support\u003C\/a\u003E from its video drivers. \u0026nbsp;I could get into the politics behind it - and I will - but the larger point here is: this is why I don\u0027t use Linux.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EWell, actually I\u0026nbsp;\u003Cem\u003Edo\u003C\/em\u003E use Linux. \u0026nbsp;I\u0027ve been using Linux pretty much 100% of the time since 2005. \u0026nbsp;I made it through law school on Linux and have gotten friends and family to use it. \u0026nbsp;I even briefly practiced law on Linux. \u0026nbsp;(Writing briefs is hard but I found a way.)\u003C\/p\u003E\n\u003Cp\u003EBut when I started working at SFO, I had to switch back to Windows. \u0026nbsp;The rest of the office used Windows and I wanted my dev environment to be the same as theirs (never mind the fact that the web servers use Linux). \u0026nbsp;It\u0027s also hard to get 100% compatibility with Microsoft Outlook in an enterprise environment. \u0026nbsp;But the real sticking point for me was the video drivers. \u0026nbsp;See, I\u0027ve got three monitors at work, and they\u0027re all plugged into my laptop dock. \u0026nbsp;The graphics card is an Nvidia Optimus card - similar to the one on my home laptop, and I never got that to work perfectly either. \u0026nbsp;(Well enough to do dual monitor output with the Compiz spinny cube, but I can\u0027t tell you how many times I had to break Linux and reinstall it before I could get that to work.) \u0026nbsp;At work, I could get dual monitors to work, although it was sketchy. \u0026nbsp;As soon as I tried for triple monitors, it simply refused to start up. \u0026nbsp;I think the dock was part of the problem, but I can\u0027t plug in two external monitors to a laptop without the dock. \u0026nbsp;Sure, I could manage with two monitors instead of three, but intentionally crippling myself for Linux didn\u0027t seem worth it.\u003C\/p\u003E\n\u003Cp\u003EBesides, Windows support for web design isn\u0027t that bad. \u0026nbsp;Well, that\u0027s not true either - it\u0027s\u0026nbsp;\u003Cem\u003Eterrible\u003C\/em\u003E. \u0026nbsp;But I found it relatively easy to install all the tools I needed. \u0026nbsp;That\u0027s a topic for another blog post, but with \u003Ca href=\u0022https:\/\/www.axway.com\/en\u0022\u003EAptana\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/drush.ws\/drush_windows_installer\u0022\u003EDrush\u003C\/a\u003E,\u0026nbsp;and the \u003Ca href=\u0022https:\/\/www.acquia.com\/products\/acquia-cloud-platform\/cloud-ide\u0022\u003EAcquia Development Desktop\u003C\/a\u003E I\u0027m pretty much there.\u003C\/p\u003E\n\u003Cp\u003EThat\u0027s worth noting. \u0026nbsp;With those three apps, I get syntax highlighting, doxygen support, bash, drush, ssh with key support, git, and a full WAMP stack. \u0026nbsp;\u003Cem\u003EIn Windows.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EOf course, I\u0027d still much rather be using Linux. \u0026nbsp;It\u0027s a much better OS for many reasons, and it\u0027s still a much better OS for web development. \u0026nbsp;I\u0027ve never seen a web design team that\u0027s all-Windows, and I probably never will again. \u0026nbsp;But hey, my monitors work.\u003C\/p\u003E\n\u003Cp\u003EAnd that\u0027s the real point there: graphics support. \u0026nbsp;For the last 10 years or so, hardware support on Linux has been \u003Cem\u003Eexcellent\u003C\/em\u003E. \u0026nbsp;Better than Windows, in fact, because pretty much all the drivers are pre-installed in the kernel. \u0026nbsp;On Windows you still have to install drivers with every piece of hardware you add, but Linux offers\u0026nbsp;\u003Cem\u003Etrue\u003C\/em\u003E plug-and-play.\u0026nbsp;\u003C\/p\u003E\n\u003Cp\u003ELately, however, it seems like the graphics card companies want to send Linux back to the dark ages. \u0026nbsp;NVidia still refuses to open source their drivers, which was okay when the open source community had pretty much reverse engineered everything, but now NVidia is coming out with baffling new hardware like Optimus that simply doesn\u0027t work in Linux. \u0026nbsp;They refuse to release Linux drivers for Linux and they refuse to let the community to do it either (with open source). \u0026nbsp;And now Intel has decided to screw us over by removing Mir support.\u003C\/p\u003E\n\u003Cp\u003EI understand there are politics involved; they\u0027ve been pushing Wayland and have even hired full time employees to write open-source code for Wayland, and I\u0027m sure they saw it as a slap in the face that Canonical decided to ignore all their hard work and support Mir instead. \u0026nbsp;Especially since Intel has, historically, been much friendlier to open source than any other graphics card manufacturer. \u0026nbsp;(Read: NVidia \u0026amp; Radeon.) \u0026nbsp;It does seem rather tone deaf for Canonical to make such a decision so unilaterally. \u0026nbsp;When you rely on alliances with large manufacturers, you should make sure you never piss them off. \u0026nbsp;Something like this should never be a surprise.\u003C\/p\u003E\n\u003Cp\u003EBottom line: I have to use Windows at work because Linux can\u0027t figure out how to run graphics cards. \u0026nbsp;In 2013.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1378703309,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":36}],"uuid":[{"value":"4a37e7c2-c4c4-432f-b1af-67a5509ea3b1"}],"vid":[{"value":413}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2025-06-02T15:40:00+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Advice to a Fellow Changling"}],"created":[{"value":"2013-09-01T23:03:31+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2025-06-02T15:40:00+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/advice-fellow-changling","pid":70,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve been following the blog of a \u003Ca href=\u0022https:\/\/erincodes.wordpress.com\/\u0022\u003Eyoung lady\u003C\/a\u003E who decided to switch careers from law to web design. \u0026nbsp;Sound familiar? \u0026nbsp;It should - I did the exact same thing. \u0026nbsp;I\u0027ve got about 2 years on her, which is enough of a perspective to know that she will turn out just fine.\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EStill, her latest blog post contained some frustration and disappointment, and I wanted to offer her some words of encouragement. \u0026nbsp;I left a note on her blog, here it is reprinted:\u003C\/p\u003E\u003Cblockquote\u003E\u003Cdiv\u003EYOU\u0027RE DOING EVERYTHING RIGHT.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003Cdiv\u003EFirst: I took the same exact journey that you are currently on. \u0026nbsp;I graduated law school in 2007 and had an awful time for five years before I decided to switch careers. \u0026nbsp;I\u0027m currently earning an excellent salary as a web developer at an airport, which is an insanely cool place to work. \u0026nbsp;I\u0027ve got exactly the kind of job I want and I\u0027m glad I was picky.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003Cdiv\u003EAnd that\u0027s my point: You SHOULD be picky. \u0026nbsp;There is a WEALTH of web design jobs out there. \u0026nbsp;You just need to find one that\u0027s a good fit for you. \u0026nbsp;Front end work is a totally legitimate focus. \u0026nbsp;If you don\u0027t feel you\u0027re strong enough, do some more professional development. \u0026nbsp;I did that too.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003Cdiv\u003EComing from the current legal market, you get the feeling that the job market in general is a big, scary place filled with rejection. \u0026nbsp;It\u0027s true in the legal world, but not in web design. \u0026nbsp;Web design is the Happy Hunting Ground.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003Cdiv\u003ELast year I tried settling for a job that wasn\u0027t quite right, and I didn\u0027t last more than a month. \u0026nbsp;Yes I got paid for my time, but there was an opportunity cost: I could have spent that month on more professional development and looking for a better job.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003Cdiv\u003EDon\u0027t settle. \u0026nbsp;Get the skill set you want, then get the job you want. \u0026nbsp;In this industry it really is that easy. \u0026nbsp;I am so, SO happy that I switched from law to web design. \u0026nbsp;I\u0027m glad you made the switch too. \u0026nbsp;Be patient and have confidence in yourself. \u0026nbsp;I know that\u0027s hard, coming from the legal world. \u0026nbsp;But hang in there because you\u0027ll land your dream job a lot faster than you expect.\u003C\/div\u003E\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\u003C\/blockquote\u003E\u003Cimg data-entity-uuid=\u0022a148f173-f7b1-4ffa-be89-5b2be1872473\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/star-trek-deep-space-nine-odo.jpeg\u0022 width=\u00221140\u0022 height=\u0022570\u0022 alt=\u0022photo of Odo, from Star Trek: DS9\u0022\u003E\u003Cp\u003E\u003Cem\u003ENot that kind of changeling.\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve been following the blog of a \u003Ca href=\u0022https:\/\/erincodes.wordpress.com\/\u0022\u003Eyoung lady\u003C\/a\u003E who decided to switch careers from law to web design. \u0026nbsp;Sound familiar? \u0026nbsp;It should - I did the exact same thing. \u0026nbsp;I\u0027ve got about 2 years on her, which is enough of a perspective to know that she will turn out just fine.\u003C\/p\u003E\n\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EStill, her latest blog post contained some frustration and disappointment, and I wanted to offer her some words of encouragement. \u0026nbsp;I left a note on her blog, here it is reprinted:\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cdiv\u003EYOU\u0027RE DOING EVERYTHING RIGHT.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EFirst: I took the same exact journey that you are currently on. \u0026nbsp;I graduated law school in 2007 and had an awful time for five years before I decided to switch careers. \u0026nbsp;I\u0027m currently earning an excellent salary as a web developer at an airport, which is an insanely cool place to work. \u0026nbsp;I\u0027ve got exactly the kind of job I want and I\u0027m glad I was picky.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EAnd that\u0027s my point: You SHOULD be picky. \u0026nbsp;There is a WEALTH of web design jobs out there. \u0026nbsp;You just need to find one that\u0027s a good fit for you. \u0026nbsp;Front end work is a totally legitimate focus. \u0026nbsp;If you don\u0027t feel you\u0027re strong enough, do some more professional development. \u0026nbsp;I did that too.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EComing from the current legal market, you get the feeling that the job market in general is a big, scary place filled with rejection. \u0026nbsp;It\u0027s true in the legal world, but not in web design. \u0026nbsp;Web design is the Happy Hunting Ground.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003ELast year I tried settling for a job that wasn\u0027t quite right, and I didn\u0027t last more than a month. \u0026nbsp;Yes I got paid for my time, but there was an opportunity cost: I could have spent that month on more professional development and looking for a better job.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EDon\u0027t settle. \u0026nbsp;Get the skill set you want, then get the job you want. \u0026nbsp;In this industry it really is that easy. \u0026nbsp;I am so, SO happy that I switched from law to web design. \u0026nbsp;I\u0027m glad you made the switch too. \u0026nbsp;Be patient and have confidence in yourself. \u0026nbsp;I know that\u0027s hard, coming from the legal world. \u0026nbsp;But hang in there because you\u0027ll land your dream job a lot faster than you expect.\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003C\/blockquote\u003E\n\u003Cp\u003E\u003Cimg data-entity-uuid=\u0022a148f173-f7b1-4ffa-be89-5b2be1872473\u0022 data-entity-type=\u0022file\u0022 src=\u0022\/sites\/default\/files\/inline-images\/star-trek-deep-space-nine-odo.jpeg\u0022 width=\u00221140\u0022 height=\u0022570\u0022 alt=\u0022photo of Odo, from Star Trek: DS9\u0022\u003E\n\u003Cp\u003E\u003Cem\u003ENot that kind of changeling.\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1378076611,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":35}],"uuid":[{"value":"6fc02764-33eb-4a25-826c-5ad942c4d084"}],"vid":[{"value":147}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Performance: Making js sit at the back of the bus"}],"created":[{"value":"2013-08-29T23:44:00+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/performance-making-js-sit-back-bus","pid":69,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIt\u0027s a common recommendation: move javascript to the bottom of the document. \u00a0That lets the actual content load faster. \u00a0Here\u0027s how to do it in Drupal.\u003C\/p\u003E\u003Ch2\u003EBackground\u003C\/h2\u003E\u003Cp\u003EI\u0027m currently in the middle of a big project to improve Drupal performance on a site I\u0027m developing. \u00a0The true solution would be to use a performant host like \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.acquia.com\/\u0022\u003EAcquia\u003C\/a\u003E, or \u003Ca href=\u0022http:\/\/aberdeencloud.com\/\u0022\u003EAberdeen\u003C\/a\u003E. \u00a0But this is the Airport, and we haven\u0027t built the political will to outsource that yet. \u00a0(Maybe that\u0027s a good thing; my job is predicated on the idea that we don\u0027t want to outsource certain things.)\u003C\/p\u003E\u003Cp\u003EMost Drupal performance recommendations have to do with caching: varnish, memcache, etc. \u00a0Unfortunately that won\u0027t work on this site. \u00a0This particular site will be low traffic, but every user will be authenticated and there are a\u00a0ton of Views on every page. \u00a0So, performance matters, but the standard solutions won\u0027t work. \u00a0So we dig deeper.\u003C\/p\u003E\u003Ch2\u003EJavascript placement\u003C\/h2\u003E\u003Cp\u003EA popular suggestion is to move js to the bottom of the page. \u00a0This is recommended by both \u003Ca href=\u0022https:\/\/developer.yahoo.com\/yslow\/\u0022\u003EYslow \u003C\/a\u003Eand \u003Ca href=\u0022https:\/\/developers.google.com\/speed\/\u0022\u003EGoogle Pagespeed\u003C\/a\u003E. \u00a0This is a good idea because when javascripts load and execute, they can freeze up loading \u0026amp; rendering on the rest of the page. \u00a0The consequence of moving js to the bottom is your page will momentarily load without it, and then \u0022change\u0022 when the js runs. \u00a0In most cases this is a minor cosmetic issue and is worth the performance improvement. \u00a0(If you really need a particular js to load at the top, keep reading. \u00a0We can do that.)\u003C\/p\u003E\u003Cp\u003EThere is no explicit way of telling Drupal to put js at the bottom, and there is no contrib module for it either. \u00a0But the good news: there\u0027s a relatively simple snippet you can add:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003Efunction YOURTHEME_js_alter(\u0026amp;$javascript) {\u0026#13;\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\u0026#13;\n    if ($script[\u0027scope\u0027] == \u0027header\u0027) {\u0026#13;\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\u0026#13;\n    }\u0026#13;\n  } \u0026#13;\n}\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EOkay great, but there are problems. \u00a0Some scripts have to run in the header, like \u003Ca href=\u0022https:\/\/modernizr.com\/\u0022\u003EModernizr \u003C\/a\u003Eor the scripts from the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/timeline\u0022\u003ETimeline module\u003C\/a\u003E. \u00a0So let\u0027s make our script a little better:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003Efunction YOURTHEME_js_alter(\u0026amp;$javascript) {\u0026#13;\n  $header_scripts = array(\u0026#13;\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\u0026#13;\n    \u0027misc\/drupal.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\u0026#13;\n  );\u0026#13;\n\u0026#13;\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\u0026#13;\n    if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts)) {\u0026#13;\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\u0026#13;\n    }\u0026#13;\n  } \u0026#13;\n}\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EThis is better. \u00a0Every single javascript will sink to the bottom of your page, except the ones you designate. \u00a0Just one problem: cdata.\u003C\/p\u003E\u003Ch2\u003ECDATA\u003C\/h2\u003E\u003Cp\u003ECDATA is an old xml standard for passing variables into html, where they can be read by javascript. \u00a0Some people will tell you that you can get rid of the cdata altogether, as long as your page is rendering in html5 (browser compatibility notwithstanding). \u00a0Unfortunately that\u0027s wrong; cdata is still necessary for some modules to work properly (like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/admin_menu\u0022\u003Eadmin menu\u003C\/a\u003E).\u003C\/p\u003E\u003Cp\u003EAlso, depending on your aggregation settings, you may see css files referenced in your cdata. \u00a0This seems to be a behavior of the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/advagg\u0022\u003EAdvanced Aggregation module\u003C\/a\u003E. \u00a0This will create a false positive in Google Pagespeed, because it recommends that css be placed in the page head, not in the footer with the javascript.\u003C\/p\u003E\u003Cp\u003EOur function discriminates between javascripts based on the script \u0022data,\u0022 which is really just a pointer to where the actual script lives. \u00a0CDATA is rendered as javascript, but there is no \u0022data\u0022 in the array. \u00a0What to do?\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003Eif ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EOur new \u0022if\u0022 statement checks for three things:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EIs the javascript currently assigned to the header? \u00a0(They all are by default.)\u003C\/li\u003E\u003Cli\u003EIs the javascript in our list of things to keep in the header?\u003C\/li\u003E\u003Cli\u003EIs our javascript an actual script, and not cdata?\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EIf all those things are true, then it will change the js scope to \u0022footer,\u0022 and Drupal will automagically render the js at the bottom of the page.\u003C\/p\u003E\u003Ch2\u003EConclusion\u003C\/h2\u003E\u003Cp\u003ELet\u0027s put it all together:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003E\/**\u0026#13;\n * Implementaion of hook_js_alter()\u0026#13;\n * Move most javascripts to bottom of page, but allow overrides to keep certain js in \u0026lt;head\u0026gt;\u0026#13;\n *\/\u0026#13;\n\u0026#13;\nfunction YOURTHEME_js_alter(\u0026amp;$javascript) {\u0026#13;\n  \/\/ Collect the scripts we want in to remain in the header scope.\u0026#13;\n  $header_scripts = array(\u0026#13;\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/timeline\/js\/timeline.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/scripts\/l10n\/en\/labellers.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-bundle.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-api.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-api.js\u0027,\u0026#13;\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-bundle.js\u0027,\u0026#13;\n    \u0027misc\/drupal.js\u0027,\u0026#13;\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\u0026#13;\n  );\u0026#13;\n\u0026#13;\n  \/\/ Change the default scope of all other scripts to footer.\u0026#13;\n  \/\/ We assume if the script is scoped to header it was done so by default.\u0026#13;\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\u0026#13;\n    if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\u0026#13;\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\u0026#13;\n    }\u0026#13;\n  } \u0026#13;\n}\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EI recommend you put this in your theme\u0027s template.php. \u00a0Hope it helps!\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E(Is that a bad reference on the 50th anniversary of the March on Washington?)\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EIt\u0027s a common recommendation: move javascript to the bottom of the document. \u0026nbsp;That lets the actual content load faster. \u0026nbsp;Here\u0027s how to do it in Drupal.\u003C\/p\u003E\n\u003Ch2\u003EBackground\u003C\/h2\u003E\n\u003Cp\u003EI\u0027m currently in the middle of a big project to improve Drupal performance on a site I\u0027m developing. \u0026nbsp;The true solution would be to use a performant host like \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.acquia.com\/\u0022\u003EAcquia\u003C\/a\u003E, or \u003Ca href=\u0022http:\/\/aberdeencloud.com\/\u0022\u003EAberdeen\u003C\/a\u003E. \u0026nbsp;But this is the Airport, and we haven\u0027t built the political will to outsource that yet. \u0026nbsp;(Maybe that\u0027s a good thing; my job is predicated on the idea that we don\u0027t want to outsource certain things.)\u003C\/p\u003E\n\u003Cp\u003EMost Drupal performance recommendations have to do with caching: varnish, memcache, etc. \u0026nbsp;Unfortunately that won\u0027t work on this site. \u0026nbsp;This particular site will be low traffic, but every user will be authenticated and there are a\u0026nbsp;ton of Views on every page. \u0026nbsp;So, performance matters, but the standard solutions won\u0027t work. \u0026nbsp;So we dig deeper.\u003C\/p\u003E\n\u003Ch2\u003EJavascript placement\u003C\/h2\u003E\n\u003Cp\u003EA popular suggestion is to move js to the bottom of the page. \u0026nbsp;This is recommended by both \u003Ca href=\u0022https:\/\/developer.yahoo.com\/yslow\/\u0022\u003EYslow \u003C\/a\u003Eand \u003Ca href=\u0022https:\/\/developers.google.com\/speed\/\u0022\u003EGoogle Pagespeed\u003C\/a\u003E. \u0026nbsp;This is a good idea because when javascripts load and execute, they can freeze up loading \u0026amp; rendering on the rest of the page. \u0026nbsp;The consequence of moving js to the bottom is your page will momentarily load without it, and then \u0022change\u0022 when the js runs. \u0026nbsp;In most cases this is a minor cosmetic issue and is worth the performance improvement. \u0026nbsp;(If you really need a particular js to load at the top, keep reading. \u0026nbsp;We can do that.)\u003C\/p\u003E\n\u003Cp\u003EThere is no explicit way of telling Drupal to put js at the bottom, and there is no contrib module for it either. \u0026nbsp;But the good news: there\u0027s a relatively simple snippet you can add:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003Efunction YOURTHEME_js_alter(\u0026amp;$javascript) {\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\n    if ($script[\u0027scope\u0027] == \u0027header\u0027) {\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\n    }\n  } \n}\u003C\/pre\u003E\u003Cp\u003EOkay great, but there are problems. \u0026nbsp;Some scripts have to run in the header, like \u003Ca href=\u0022https:\/\/modernizr.com\/\u0022\u003EModernizr \u003C\/a\u003Eor the scripts from the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/timeline\u0022\u003ETimeline module\u003C\/a\u003E. \u0026nbsp;So let\u0027s make our script a little better:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003Efunction YOURTHEME_js_alter(\u0026amp;$javascript) {\n  $header_scripts = array(\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\n    \u0027misc\/drupal.js\u0027,\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\n  );\n\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\n    if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts)) {\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\n    }\n  } \n}\u003C\/pre\u003E\u003Cp\u003EThis is better. \u0026nbsp;Every single javascript will sink to the bottom of your page, except the ones you designate. \u0026nbsp;Just one problem: cdata.\u003C\/p\u003E\n\u003Ch2\u003ECDATA\u003C\/h2\u003E\n\u003Cp\u003ECDATA is an old xml standard for passing variables into html, where they can be read by javascript. \u0026nbsp;Some people will tell you that you can get rid of the cdata altogether, as long as your page is rendering in html5 (browser compatibility notwithstanding). \u0026nbsp;Unfortunately that\u0027s wrong; cdata is still necessary for some modules to work properly (like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/admin_menu\u0022\u003Eadmin menu\u003C\/a\u003E).\u003C\/p\u003E\n\u003Cp\u003EAlso, depending on your aggregation settings, you may see css files referenced in your cdata. \u0026nbsp;This seems to be a behavior of the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/advagg\u0022\u003EAdvanced Aggregation module\u003C\/a\u003E. \u0026nbsp;This will create a false positive in Google Pagespeed, because it recommends that css be placed in the page head, not in the footer with the javascript.\u003C\/p\u003E\n\u003Cp\u003EOur function discriminates between javascripts based on the script \u0022data,\u0022 which is really just a pointer to where the actual script lives. \u0026nbsp;CDATA is rendered as javascript, but there is no \u0022data\u0022 in the array. \u0026nbsp;What to do?\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003Eif ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\u003C\/pre\u003E\u003Cp\u003EOur new \u0022if\u0022 statement checks for three things:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIs the javascript currently assigned to the header? \u0026nbsp;(They all are by default.)\u003C\/li\u003E\n\u003Cli\u003EIs the javascript in our list of things to keep in the header?\u003C\/li\u003E\n\u003Cli\u003EIs our javascript an actual script, and not cdata?\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EIf all those things are true, then it will change the js scope to \u0022footer,\u0022 and Drupal will automagically render the js at the bottom of the page.\u003C\/p\u003E\n\u003Ch2\u003EConclusion\u003C\/h2\u003E\n\u003Cp\u003ELet\u0027s put it all together:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003E\/**\n * Implementaion of hook_js_alter()\n * Move most javascripts to bottom of page, but allow overrides to keep certain js in \u0026lt;head\u0026gt;\n *\/\n\nfunction YOURTHEME_js_alter(\u0026amp;$javascript) {\n  \/\/ Collect the scripts we want in to remain in the header scope.\n  $header_scripts = array(\n    \u0027sites\/all\/libraries\/modernizr\/modernizr.min.js\u0027,\n    \u0027sites\/all\/modules\/timeline\/js\/timeline.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/scripts\/l10n\/en\/labellers.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-bundle.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_js\/timeline-api.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-api.js\u0027,\n    \u0027sites\/all\/libraries\/simile_timeline\/timeline_ajax\/simile-ajax-bundle.js\u0027,\n    \u0027misc\/drupal.js\u0027,\n    \u0027sites\/all\/modules\/jquery_update\/replace\/jquery\/1.5\/jquery.min.js\u0027,\n  );\n\n  \/\/ Change the default scope of all other scripts to footer.\n  \/\/ We assume if the script is scoped to header it was done so by default.\n  foreach ($javascript as $key =\u0026gt; \u0026amp;$script) {\n    if ($script[\u0027scope\u0027] == \u0027header\u0027 \u0026amp;\u0026amp; !in_array($script[\u0027data\u0027], $header_scripts) \u0026amp;\u0026amp; $script[\u0027type\u0027] == \u0027file\u0027) {\n      $script[\u0027scope\u0027] = \u0027footer\u0027;\n    }\n  } \n}\u003C\/pre\u003E\u003Cp\u003EI recommend you put this in your theme\u0027s template.php. \u0026nbsp;Hope it helps!\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E(Is that a bad reference on the 50th anniversary of the March on Washington?)\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1377820335,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":34}],"uuid":[{"value":"09c7f817-1ec7-44e3-abdf-baada8e98b3a"}],"vid":[{"value":139}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"How to Support iOS Photo Uploads"}],"created":[{"value":"2013-08-24T00:54:05+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/how-support-ios-photo-uploads","pid":68,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027m building a Drupal app that lets you upload photos from your mobile device directly to the site. \u00a0The problem: half of them are coming out sideways, or even upside down.\u003C\/p\u003E\u003Ch2\u003EWhat\u0027s Going On\u003C\/h2\u003E\u003Cp\u003EUntil just a few years ago, it was impossible to even upload photos from iOS. \u00a0Then it became possible, but there were dark whispers that iOS was stripping out metadata. \u00a0Longwinded diatribes about how Apple wants to \u0022protect\u0022 us by crippling our electronic devices. \u00a0It\u0027s true, but that\u0027s not the problem here. \u00a0After some research, I discovered that Android devices were doing the exact same thing: I could upload a photo using my mobile device, but it might be upside down or sideways.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003ESide note: Most modern cameras, including smartphones, attach additional information to a photograph. \u00a0One piece of information is \u0022orientation.\u0022 \u00a0So if you hold your phone sideways when you take the shot, the image is labeled as a \u0022sideways\u0022 image. \u00a0Any smart program that can display your photo should read that data and display the image with the correct orientation. \u00a0This information is known as EXIF data.\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EAfter more research, I discovered that the EXIF data\u00a0not only being uploaded, but Drupal was saving it too. \u00a0So why did my photos appear sideways?\u003C\/p\u003E\u003Cp\u003EImagecache.\u003C\/p\u003E\u003Cp\u003EUntil D7, Imagecache was an add-on module to help you handle images. \u00a0It would automatically render thumbnails, midsize images, etc. for any image you uploaded. \u00a0This made it super easy to create \u003Ca href=\u0022\/portfolio\u0022\u003Ecustom galleries\u003C\/a\u003E, for instance. \u00a0Starting with D7, this was baked into core.\u003C\/p\u003E\u003Ch2\u003EThe Problem\u003C\/h2\u003E\u003Cp\u003EThe problem:\u00a0\u003Cstrong\u003Eimagecache ignores EXIF data.\u003C\/strong\u003E\u00a0 In other words, imagecache doesn\u0027t care if your photo is supposed to be displayed sideways or upside down. \u00a0It will always show the same orientation, so sometimes your photos will be rendered sideways or upside down.\u003C\/p\u003E\u003Ch2\u003EThe Solution\u003C\/h2\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20132308175051.png\u0022 style=\u0022float: right;\u0022 \/\u003EYou no longer need to install imagecache since it\u0027s now baked into core. \u00a0But you still need to install an add-on module called \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/imagecache_actions\u0022\u003Eimagecache actions\u003C\/a\u003E. \u00a0This module is advertised as an \u0022artsy fartsy\u0022 module that does useless things like add an old fashioned photograph border or a stamp to make it look like your airplane is from 1940.\u003C\/p\u003E\u003Cp\u003EIt will also read EXIF data.\u003C\/p\u003E\u003Cp\u003EUnfortunately,\u00a0\u003Cstrong\u003Ethis feature is not documented.\u003C\/strong\u003E \u00a0In fact, documentation is poor for the entire module. \u00a0I was ready to skip over the entire thing and look at some custom solution to detect and rotate photos, but luckily my coworker caught it.\u003C\/p\u003E\u003Cp\u003EEven better: you don\u0027t need to create new image styles. \u00a0Just add \u0022autorotate\u0022 to your existing image styles and they will display correctly: thumbnail, midsize, etc.\u003C\/p\u003E\u003Cp\u003EMy coworker and I spent hours on this and I\u0027m amazed that no one has blogged about it before. \u00a0So, here you go, weary Internet Traveler. \u00a0For you, at least this once, your search is over.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E(It\u0027s 6 pm on a Friday. \u00a0Why am I still here?)\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027m building a Drupal app that lets you upload photos from your mobile device directly to the site. \u0026nbsp;The problem: half of them are coming out sideways, or even upside down.\u003C\/p\u003E\n\u003Ch2\u003EWhat\u0027s Going On\u003C\/h2\u003E\n\u003Cp\u003EUntil just a few years ago, it was impossible to even upload photos from iOS. \u0026nbsp;Then it became possible, but there were dark whispers that iOS was stripping out metadata. \u0026nbsp;Longwinded diatribes about how Apple wants to \u0022protect\u0022 us by crippling our electronic devices. \u0026nbsp;It\u0027s true, but that\u0027s not the problem here. \u0026nbsp;After some research, I discovered that Android devices were doing the exact same thing: I could upload a photo using my mobile device, but it might be upside down or sideways.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003ESide note: Most modern cameras, including smartphones, attach additional information to a photograph. \u0026nbsp;One piece of information is \u0022orientation.\u0022 \u0026nbsp;So if you hold your phone sideways when you take the shot, the image is labeled as a \u0022sideways\u0022 image. \u0026nbsp;Any smart program that can display your photo should read that data and display the image with the correct orientation. \u0026nbsp;This information is known as EXIF data.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EAfter more research, I discovered that the EXIF data\u0026nbsp;not only being uploaded, but Drupal was saving it too. \u0026nbsp;So why did my photos appear sideways?\u003C\/p\u003E\n\u003Cp\u003EImagecache.\u003C\/p\u003E\n\u003Cp\u003EUntil D7, Imagecache was an add-on module to help you handle images. \u0026nbsp;It would automatically render thumbnails, midsize images, etc. for any image you uploaded. \u0026nbsp;This made it super easy to create \u003Ca href=\u0022\/portfolio\u0022\u003Ecustom galleries\u003C\/a\u003E, for instance. \u0026nbsp;Starting with D7, this was baked into core.\u003C\/p\u003E\n\u003Ch2\u003EThe Problem\u003C\/h2\u003E\n\u003Cp\u003EThe problem:\u0026nbsp;\u003Cstrong\u003Eimagecache ignores EXIF data.\u003C\/strong\u003E\u0026nbsp; In other words, imagecache doesn\u0027t care if your photo is supposed to be displayed sideways or upside down. \u0026nbsp;It will always show the same orientation, so sometimes your photos will be rendered sideways or upside down.\u003C\/p\u003E\n\u003Ch2\u003EThe Solution\u003C\/h2\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20132308175051.png\u0022 style=\u0022float: right;\u0022\u003EYou no longer need to install imagecache since it\u0027s now baked into core. \u0026nbsp;But you still need to install an add-on module called \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/imagecache_actions\u0022\u003Eimagecache actions\u003C\/a\u003E. \u0026nbsp;This module is advertised as an \u0022artsy fartsy\u0022 module that does useless things like add an old fashioned photograph border or a stamp to make it look like your airplane is from 1940.\u003C\/p\u003E\n\u003Cp\u003EIt will also read EXIF data.\u003C\/p\u003E\n\u003Cp\u003EUnfortunately,\u0026nbsp;\u003Cstrong\u003Ethis feature is not documented.\u003C\/strong\u003E \u0026nbsp;In fact, documentation is poor for the entire module. \u0026nbsp;I was ready to skip over the entire thing and look at some custom solution to detect and rotate photos, but luckily my coworker caught it.\u003C\/p\u003E\n\u003Cp\u003EEven better: you don\u0027t need to create new image styles. \u0026nbsp;Just add \u0022autorotate\u0022 to your existing image styles and they will display correctly: thumbnail, midsize, etc.\u003C\/p\u003E\n\u003Cp\u003EMy coworker and I spent hours on this and I\u0027m amazed that no one has blogged about it before. \u0026nbsp;So, here you go, weary Internet Traveler. \u0026nbsp;For you, at least this once, your search is over.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E(It\u0027s 6 pm on a Friday. \u0026nbsp;Why am I still here?)\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1377305645,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":33}],"uuid":[{"value":"cf826baa-3456-4772-8956-4d84a7aa2462"}],"vid":[{"value":138}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Advanced field templates"}],"created":[{"value":"2013-07-05T21:29:27+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/advanced-field-templates","pid":67,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI recently had to adjust the output from a field on a page. \u00a0Here\u0027s how I did it.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EThere are some excellent articles and even \u003Ca href=\u0022http:\/\/lin-clark.com\/blog\/intro-drupal-7-theming-fields-and-nodes-templates\u0022\u003Einstructional videos\u003C\/a\u003E on how to override templates for things in Drupal - pages, content types, even individual fields. \u00a0But everything I found described how to alter the\u00a0\u003Cem\u003Ehtml wrapper around the field item\u003C\/em\u003E, and said nothing about how to alter the field output itself.\u003C\/p\u003E\u003Ch2\u003EThe Challenge\u003C\/h2\u003E\u003Cp\u003EFor example: Let\u0027s say I\u0027ve got some geolocation data. \u00a0I have stored latitude and longitude and the field is set to output as a geofield map. \u00a0But let\u0027s say I want to take that data and output it as a static map instead.\u003C\/p\u003E\u003Ch2\u003EThere\u0027s A Module For That\u003C\/h2\u003E\u003Cp\u003EOf course there is. \u00a0You could use the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/geofield\u0022\u003Egeofield \u003C\/a\u003Ewith \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/staticmap\u0022\u003Estaticmap \u003C\/a\u003Emodules. \u00a0But those are both community-contributed modules with few recent updates and little third-party support. \u00a0I found several patches that hadn\u0027t even been reviewed \u0026amp; tested by the community. \u00a0Naturally, the modules didn\u0027t work for me.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003ENote: I deeply appreciate the efforts of other community developers. \u00a0I\u0027m a contrib module author myself and I respect how much effort it takes to publish a module, nonetheless support it. \u00a0Many modules are reliant on client funding. \u00a0In addition, if the community refuses to review a patch, the module maintainer can hardly be blamed for that. \u00a0All I\u0027m saying is that these appear to be fringe cases that don\u0027t get the necessary support from the community as a whole.\u003C\/em\u003E\u003C\/p\u003E\u003Ch2\u003ERoll Up Your Sleeves\u003C\/h2\u003E\u003Cp\u003ETime to roll a custom template. \u00a0This will probably go in your theme directory. \u00a0(One exception would be if you have a custom module and want to use it to modify the output of a field.)\u003C\/p\u003E\u003Cp\u003ETemplate files follow a naming convention. \u00a0For a field, it\u0027s \u0022field--your_field_here.tpl.php.\u0022 \u00a0In my case, it was field--field_location_computed.tpl.php. \u00a0Notes:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EThere are two dashes after \u0022field\u0022 and before your field name.\u003C\/li\u003E\u003Cli\u003EYour field name is the machine name for your field. \u00a0See Admin \u0026gt; Structure \u0026gt; Content Types.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThere\u0027s a lovely default that already exists for field templates. \u00a0Here it is:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag\u0022\u003E\u0026lt;?php foreach ($items as $delta =\u0026gt; $item) : ?\u0026gt;\u0026#13;\n  \u0026lt;?php print render($item); ?\u0026gt;\u0026#13;\n\u0026lt;?php endforeach; ?\u0026gt;\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EThat\u0027s great, but the problem here is the render() function. \u00a0That\u0027s exactly what we don\u0027t want: pre-processed output from the field. \u00a0We want to reach inside the field, pull out the raw data inside, and serve it up with seaweed and rice. \u00a0Here\u0027s how:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003E$nid = arg(1);\u00a0\/\/ Grab the node id from the url\u0026#13;\n$node = node_load($nid);\u00a0\/\/ Load the node you want\u0026#13;\n$geo = field_get_items(\u0027node\u0027, $node, \u0027your_field_here\u0027);\u00a0\/\/ Load the field from the node\u0026#13;\n\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EThe field will be loaded as an array with all its bits and pieces inside. \u00a0You can use a print_r() to figure out what\u0027s in there and how to grab it. \u00a0Here\u0027s what it really looks like:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022 style=\u0022font-size: 13px;\u0022\u003E$nid = arg(1);\u00a0\/\/ Grab the node id from the url\u0026#13;\n$node = node_load($nid);\u00a0\/\/ Load the node you want\u0026#13;\n$geo = field_get_items(\u0027node\u0027, $node, \u0027field_location_computed\u0027);\u00a0\/\/ Load the field from the node\u0026#13;\n$lat = $geo[0][\u0027lat\u0027];\u0026#13;\n$lon = $geo[0][\u0027lon\u0027];\u0026#13;\nprint \u0027\u0026lt;div class=\u0022static\u0022\u0026gt;\u0026lt;img src=\u0022http:\/\/ojw.dev.openstreetmap.org\/StaticMap\/?show=1\u0026amp;layer=mapnik\u0026amp;z=17\u0026amp;size=500x500\u0026amp;mlat0=\u0027 . $lat . \u0027\u0026amp;mlon0=\u0027 . $lon . \u0027\u0026amp;lat=\u0027 . $lat . \u0027\u0026amp;lon=\u0027 . $lon . \u0027\u0022 \/\u0026gt;\u0026lt;\/div\u0026gt;\u0027;\u003C\/pre\u003E\u0026#13;\n\u003Cdiv\u003EThis example code will print a static map image using data from the field:\u003C\/div\u003E\u003Cdiv\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20130507142549.png\u0022 \/\u003E\u003C\/div\u003E\u003Cdiv\u003E\u00a0\u003C\/div\u003E\u003Cdiv\u003EYou could, of course, write your own module with preprocess_ functions, or do something with views, blocks, and the viewfield module. \u00a0But why bother? \u00a0You can theme your output using a theme template file, which seems more appropriate somehow. \u00a0Using this technique, you can re-render any field and output the data any way you want, using html and php. \u00a0Pretty powerful for theme output.\u003C\/div\u003E","format":"full_html","processed":"\u003Cp\u003EI recently had to adjust the output from a field on a page. \u0026nbsp;Here\u0027s how I did it.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EThere are some excellent articles and even \u003Ca href=\u0022http:\/\/lin-clark.com\/blog\/intro-drupal-7-theming-fields-and-nodes-templates\u0022\u003Einstructional videos\u003C\/a\u003E on how to override templates for things in Drupal - pages, content types, even individual fields. \u0026nbsp;But everything I found described how to alter the\u0026nbsp;\u003Cem\u003Ehtml wrapper around the field item\u003C\/em\u003E, and said nothing about how to alter the field output itself.\u003C\/p\u003E\n\u003Ch2\u003EThe Challenge\u003C\/h2\u003E\n\u003Cp\u003EFor example: Let\u0027s say I\u0027ve got some geolocation data. \u0026nbsp;I have stored latitude and longitude and the field is set to output as a geofield map. \u0026nbsp;But let\u0027s say I want to take that data and output it as a static map instead.\u003C\/p\u003E\n\u003Ch2\u003EThere\u0027s A Module For That\u003C\/h2\u003E\n\u003Cp\u003EOf course there is. \u0026nbsp;You could use the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/geofield\u0022\u003Egeofield \u003C\/a\u003Ewith \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/staticmap\u0022\u003Estaticmap \u003C\/a\u003Emodules. \u0026nbsp;But those are both community-contributed modules with few recent updates and little third-party support. \u0026nbsp;I found several patches that hadn\u0027t even been reviewed \u0026amp; tested by the community. \u0026nbsp;Naturally, the modules didn\u0027t work for me.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003ENote: I deeply appreciate the efforts of other community developers. \u0026nbsp;I\u0027m a contrib module author myself and I respect how much effort it takes to publish a module, nonetheless support it. \u0026nbsp;Many modules are reliant on client funding. \u0026nbsp;In addition, if the community refuses to review a patch, the module maintainer can hardly be blamed for that. \u0026nbsp;All I\u0027m saying is that these appear to be fringe cases that don\u0027t get the necessary support from the community as a whole.\u003C\/em\u003E\u003C\/p\u003E\n\u003Ch2\u003ERoll Up Your Sleeves\u003C\/h2\u003E\n\u003Cp\u003ETime to roll a custom template. \u0026nbsp;This will probably go in your theme directory. \u0026nbsp;(One exception would be if you have a custom module and want to use it to modify the output of a field.)\u003C\/p\u003E\n\u003Cp\u003ETemplate files follow a naming convention. \u0026nbsp;For a field, it\u0027s \u0022field--your_field_here.tpl.php.\u0022 \u0026nbsp;In my case, it was field--field_location_computed.tpl.php. \u0026nbsp;Notes:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EThere are two dashes after \u0022field\u0022 and before your field name.\u003C\/li\u003E\n\u003Cli\u003EYour field name is the machine name for your field. \u0026nbsp;See Admin \u0026gt; Structure \u0026gt; Content Types.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThere\u0027s a lovely default that already exists for field templates. \u0026nbsp;Here it is:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag\u0022\u003E\u0026lt;?php foreach ($items as $delta =\u0026gt; $item) : ?\u0026gt;\n  \u0026lt;?php print render($item); ?\u0026gt;\n\u0026lt;?php endforeach; ?\u0026gt;\u003C\/pre\u003E\u003Cp\u003EThat\u0027s great, but the problem here is the render() function. \u0026nbsp;That\u0027s exactly what we don\u0027t want: pre-processed output from the field. \u0026nbsp;We want to reach inside the field, pull out the raw data inside, and serve it up with seaweed and rice. \u0026nbsp;Here\u0027s how:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003E$nid = arg(1);\u0026nbsp;\/\/ Grab the node id from the url\n$node = node_load($nid);\u0026nbsp;\/\/ Load the node you want\n$geo = field_get_items(\u0027node\u0027, $node, \u0027your_field_here\u0027);\u0026nbsp;\/\/ Load the field from the node\n\u003C\/pre\u003E\u003Cp\u003EThe field will be loaded as an array with all its bits and pieces inside. \u0026nbsp;You can use a print_r() to figure out what\u0027s in there and how to grab it. \u0026nbsp;Here\u0027s what it really looks like:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: php\u0022 style=\u0022font-size: 13px;\u0022\u003E$nid = arg(1);\u0026nbsp;\/\/ Grab the node id from the url\n$node = node_load($nid);\u0026nbsp;\/\/ Load the node you want\n$geo = field_get_items(\u0027node\u0027, $node, \u0027field_location_computed\u0027);\u0026nbsp;\/\/ Load the field from the node\n$lat = $geo[0][\u0027lat\u0027];\n$lon = $geo[0][\u0027lon\u0027];\nprint \u0027\u0026lt;div class=\u0022static\u0022\u0026gt;\u0026lt;img src=\u0022http:\/\/ojw.dev.openstreetmap.org\/StaticMap\/?show=1\u0026amp;layer=mapnik\u0026amp;z=17\u0026amp;size=500x500\u0026amp;mlat0=\u0027 . $lat . \u0027\u0026amp;mlon0=\u0027 . $lon . \u0027\u0026amp;lat=\u0027 . $lat . \u0027\u0026amp;lon=\u0027 . $lon . \u0027\u0022 \/\u0026gt;\u0026lt;\/div\u0026gt;\u0027;\u003C\/pre\u003E\u003Cdiv\u003EThis example code will print a static map image using data from the field:\u003C\/div\u003E\n\u003Cdiv\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20130507142549.png\u0022\u003E\u003C\/div\u003E\n\u003Cdiv\u003E\u0026nbsp;\u003C\/div\u003E\n\u003Cdiv\u003EYou could, of course, write your own module with preprocess_ functions, or do something with views, blocks, and the viewfield module. \u0026nbsp;But why bother? \u0026nbsp;You can theme your output using a theme template file, which seems more appropriate somehow. \u0026nbsp;Using this technique, you can re-render any field and output the data any way you want, using html and php. \u0026nbsp;Pretty powerful for theme output.\u003C\/div\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1373060055,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":31}],"uuid":[{"value":"d00bac75-6cbf-4cd8-86dc-dbe64d903aca"}],"vid":[{"value":377}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-12-08T04:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"htop and bar"}],"created":[{"value":"2013-06-18T17:26:27+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-12-08T04:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/htop-and-bar","pid":65,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ETwo simple tools that will make your development a lot nicer: htop and bar.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003EHtop\u003C\/strong\u003E is a replacement for top, a command line tool that shows you what processes are running. \u00a0It also shows you cpu load, free memory, etc. \u00a0Htop does the same, but it\u0027s\u00a0\u003Cem\u003Eprettier\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E:\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cimg alt=\u0022\u0022 src=\u0022https:\/\/htop.sourceforge.net\/htop-0.4.png\u0022 style=\u0022width: 686px; height: 456px;\u0022 \/\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENaturally, it\u0027s easy to install for Ubuntu:\u003C\/span\u003E\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: bash\u0022\u003Esudo apt-get install htop\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EFor everyone else, \u003Ca href=\u0022https:\/\/htop.sourceforge.net\/\u0022\u003Ethere\u0027s Sourceforge\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003ENext up is\u00a0\u003Cstrong\u003Ebar\u003C\/strong\u003E. \u00a0Simply put, bar gives you a progress bar:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022https:\/\/clpbar.sourceforge.net\/bar-1.06-screenshot.jpg\u0022 style=\u0022width: 564px; height: 40px;\u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003EIt\u0027s good for file transfers or other operations that involve large files. \u00a0I like to use it to load mysql dump files:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: bash\u0022\u003Ebar dumpfile.sql | mysql databasename\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EIt gives you file transfer rate, eta, percentage done, and a pretty progress bar. \u00a0The built-in mysql import command gives absolutely no feedback until the job is done, and if you have a 1 GB database, that\u0027s a lot of sitting around wondering if it\u0027s even working. \u00a0Htop could help with that, but it won\u0027t tell you how long you have left. \u00a0Bar\u0027s cool that way.\u003C\/p\u003E\u003Cp\u003EOf course bar is easy to install:\u003C\/p\u003E\u0026#13;\n\u003Cpre class=\u0022brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag\u0022\u003Esudo apt-get install bar\u003C\/pre\u003E\u0026#13;\n\u003Cp\u003EOr \u003Ca href=\u0022https:\/\/clpbar.sourceforge.net\/\u0022\u003Ehit up Sourceforge\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EOf course, both of these tools require the command line. \u00a0If you\u0027re not using the command line yet, you should. \u00a0These things are fun and fun is good.\u003C\/p\u003E\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E(Hat tip to Dr. Seuss.)\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ETwo simple tools that will make your development a lot nicer: htop and bar.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EHtop\u003C\/strong\u003E is a replacement for top, a command line tool that shows you what processes are running. \u0026nbsp;It also shows you cpu load, free memory, etc. \u0026nbsp;Htop does the same, but it\u0027s\u0026nbsp;\u003Cem\u003Eprettier\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E:\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cimg alt src=\u0022https:\/\/htop.sourceforge.net\/htop-0.4.png\u0022 style=\u0022width: 686px; height: 456px;\u0022\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENaturally, it\u0027s easy to install for Ubuntu:\u003C\/span\u003E\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Esudo apt-get install htop\u003C\/pre\u003E\u003Cp\u003EFor everyone else, \u003Ca href=\u0022https:\/\/htop.sourceforge.net\/\u0022\u003Ethere\u0027s Sourceforge\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003ENext up is\u0026nbsp;\u003Cstrong\u003Ebar\u003C\/strong\u003E. \u0026nbsp;Simply put, bar gives you a progress bar:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022https:\/\/clpbar.sourceforge.net\/bar-1.06-screenshot.jpg\u0022 style=\u0022width: 564px; height: 40px;\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s good for file transfers or other operations that involve large files. \u0026nbsp;I like to use it to load mysql dump files:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ebar dumpfile.sql | mysql databasename\u003C\/pre\u003E\u003Cp\u003EIt gives you file transfer rate, eta, percentage done, and a pretty progress bar. \u0026nbsp;The built-in mysql import command gives absolutely no feedback until the job is done, and if you have a 1 GB database, that\u0027s a lot of sitting around wondering if it\u0027s even working. \u0026nbsp;Htop could help with that, but it won\u0027t tell you how long you have left. \u0026nbsp;Bar\u0027s cool that way.\u003C\/p\u003E\n\u003Cp\u003EOf course bar is easy to install:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag\u0022\u003Esudo apt-get install bar\u003C\/pre\u003E\u003Cp\u003EOr \u003Ca href=\u0022https:\/\/clpbar.sourceforge.net\/\u0022\u003Ehit up Sourceforge\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EOf course, both of these tools require the command line. \u0026nbsp;If you\u0027re not using the command line yet, you should. \u0026nbsp;These things are fun and fun is good.\u003C\/p\u003E\n\u003Cp\u003EJ\u0026lt;\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E(Hat tip to Dr. Seuss.)\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1670472001,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":30}],"uuid":[{"value":"d2926f11-f38d-4472-9482-68eb25f1db49"}],"vid":[{"value":136}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Making javascript play nice in Drupal 7"}],"created":[{"value":"2013-06-14T16:43:27+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/making-javascript-play-nice-drupal-7","pid":64,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThe task: Put some custom javascript in a file and have it run on a Drupal page.\u003C\/p\u003E\u003Cp\u003EThis is theoretically easy, but I had trouble getting the javascript to do certain things with certain page elements. \u00a0Drupal makes it easy to add javascript, but then it sets up a bunch of restrictions. \u00a0This is for security reasons and it\u0027s a good idea, but it\u0027s just one more thing in D7 that is more complicated than it should be. \u00a0Anyway, here\u0027s the solution:\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E(function($) { \/\/ wrapper to make it work with Drupal\u003C\/span\u003E\u003C\/p\u003E\u0026#13;\n\u003Cpre\u003E\u003C\/pre\u003E\u0026#13;\n\u003Cdiv\u003E\u0026#13;\n\u003Cpre class=\u0022brush: php\u0022\u003E(function($) { \/\/ wrapper to make it work with Drupal\u0026#13;\nDrupal.behaviors.myBehavior = {\u0026#13;\n  attach: function (context, settings) {\u0026#13;\n    \/\/ code starts\u0026#13;\n    $(\u0022#edit-asset-items\u0022).click(function() {\u0026#13;\n      alert(\u0022Hello World\u0022);\u0026#13;\n    });\u0026#13;\n    \/\/ code ends\u0026#13;\n  }\u0026#13;\n};\u0026#13;\n})(jQuery);\u0026#13;\n\u0026#13;\n\u003C\/pre\u003E\u0026#13;\n\u003C\/div\u003E\u003Cp\u003EThere are a couple keys here. \u00a0First, you need to wrap your code in Drupal.behaviors.myBehavior and attach: function (context, setttings). \u00a0Also, tack on an explicity (jQuery) at the very end. \u00a0\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESimple problem, simple solution.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThere are, of course, other ways of adding javascript to Drupal, such as drupal_add_js(). \u00a0But if you want to put your javascript in an external file, this is how.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EFor more information:\u00a0\u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/171213\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ehttps:\/\/www.drupal.org\/node\/171213\u003C\/a\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThe task: Put some custom javascript in a file and have it run on a Drupal page.\u003C\/p\u003E\n\u003Cp\u003EThis is theoretically easy, but I had trouble getting the javascript to do certain things with certain page elements. \u0026nbsp;Drupal makes it easy to add javascript, but then it sets up a bunch of restrictions. \u0026nbsp;This is for security reasons and it\u0027s a good idea, but it\u0027s just one more thing in D7 that is more complicated than it should be. \u0026nbsp;Anyway, here\u0027s the solution:\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E(function($) { \/\/ wrapper to make it work with Drupal\u003C\/span\u003E\u003C\/p\u003E\n\u003Cpre\u003E\u003C\/pre\u003E\u003Cdiv\u003E\n\u003Cpre class=\u0022brush: php\u0022\u003E(function($) { \/\/ wrapper to make it work with Drupal\nDrupal.behaviors.myBehavior = {\n  attach: function (context, settings) {\n    \/\/ code starts\n    $(\u0022#edit-asset-items\u0022).click(function() {\n      alert(\u0022Hello World\u0022);\n    });\n    \/\/ code ends\n  }\n};\n})(jQuery);\n\n\u003C\/pre\u003E\u003C\/div\u003E\n\u003Cp\u003EThere are a couple keys here. \u0026nbsp;First, you need to wrap your code in Drupal.behaviors.myBehavior and attach: function (context, setttings). \u0026nbsp;Also, tack on an explicity (jQuery) at the very end. \u0026nbsp;\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESimple problem, simple solution.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThere are, of course, other ways of adding javascript to Drupal, such as drupal_add_js(). \u0026nbsp;But if you want to put your javascript in an external file, this is how.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EFor more information:\u0026nbsp;\u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/171213\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ehttps:\/\/www.drupal.org\/node\/171213\u003C\/a\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1371228207,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":29}],"uuid":[{"value":"e5e9ecd5-5d62-4f41-9cc4-cf4036c9131a"}],"vid":[{"value":135}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Howto: LinkedIn"}],"created":[{"value":"2013-05-18T20:42:19+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/howto-linkedin","pid":63,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIt seems odd that I have to post instructions on social networking. \u00a0If you\u0027re reading this, odds are you\u0027re a web developer with a fair amount of experience. \u00a0And yet, people don\u0027t seem to understand what to do with LinkedIn.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Ch2\u003EWhat It Is\u003C\/h2\u003E\u003Cp\u003EMaybe we should start by talking about what LinkedIn is and what it isn\u0027t. \u00a0It\u0027s important to realize that\u00a0\u003Cstrong\u003ELinkedIn is not Facebook\u003C\/strong\u003E. \u00a0So, what is it?\u003C\/p\u003E\u003Cp\u003ELinkedIn is a\u00a0\u003Cstrong\u003Eprofessional network\u003C\/strong\u003E. \u00a0That is, it\u0027s a social network of professional contacts. \u00a0If you fill out your profile, it gives an outline of your skills, job history, and education. \u00a0Businesses can have an online presence that lists their employees.\u003C\/p\u003E\u003Cp\u003ELinkedIn is a tool, and tools need a purpose. \u00a0LinkedIn has several purposes:\u003C\/p\u003E\u003Ch3\u003EFinding a Job\u003C\/h3\u003E\u003Cp\u003EWhen I apply for a job, I always use LinkedIn. \u00a0There are a few different things I can do:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EFigure out if I know someone who works at that company, or if I know someone who knows someone. \u00a0If you know someone who knows someone, you can request an introduction. \u00a0I\u0027ve gotten several in-person interviews that way. \u00a0\u003C\/li\u003E\u003Cli\u003ECheck to see if anyone went to the same school as you, then use the alumni connection.\u003C\/li\u003E\u003Cli\u003EIf you get an interview, read up on the person who will be interviewing you. \u00a0What\u0027s their work history? \u00a0Is their focus technical or managerial? \u00a0If other people have endorsed their work, what have other people said about them? \u00a0These are probably character traits that this person values. \u00a0In the interview you can let them know that you share the same qualities.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EYou can also get endorsements for current and past work. \u00a0The best way to do this is to give endorsements of others; your coworkers are likely to reciprocate. \u00a0In certain industries, you can even upload samples of your own work, like an article in a trade journal that you wrote. \u00a0Also be sure to link to relevant websites, especially if you have an online portfolio of your own work. \u00a0When a prospective employer checks out your LinkedIn profile, they\u0027ll see these things.\u003C\/p\u003E\u003Cp\u003EAlso, you can put the \u0022social\u0022 back in \u0022social network\u0022 and join a LinkedIn Group. \u00a0A lot of groups have job listings. \u00a0At the very least, you can ask for job advice.\u003C\/p\u003E\u003Cp\u003EDon\u0027t overlook the power of your existing networks. \u00a0For example, I\u0027ve been part of a large non-profit for the past 20+ years. \u00a0I\u0027ve invited other volunteers to connect with me on LinkedIn, because I\u0027m happy to share my professional network with them. \u00a0Same goes for former coworkers. \u00a0If Bob has been hired by a better company, he might help you get a job there too. \u00a0LinkedIn is the place to start.\u003C\/p\u003E\u003Cp\u003EFinally, from the \u0022it should be obvious\u0022 department: LinkedIn has job listings. \u00a0It\u0027ll even email you. \u00a0Since I switch careers 18 months ago, LinkedIn has been somewhat confused, and now sends me job listings for both attorneys and web developers. \u00a0But most of the job applications I\u0027ve submitted in the last year have been through LinkedIn. \u00a0As an added bonus, it already has all of your contact info and employment history, so filling out job apps is actually fast and easy. \u00a0You can even save cover letters. \u00a0(Although you shouldn\u0027t - every cover letter should be tailored to the specific job, and ideally you should do some name dropping thanks to your LinkedIn research.)\u003C\/p\u003E\u003Ch3\u003EFinding an Employee\u003C\/h3\u003E\u003Cp\u003EI just mentioned that LinkedIn does job listings. \u00a0If I were hiring, I\u0027d start with LinkedIn. \u00a0Not only does it simplify the application workflow, but you\u0027re going to get much better information on each applicant. \u00a0In addition, there doesn\u0027t seem to be a lot of spammers on LinkedIn, so you\u0027re more likely to get high quality inquiries. \u00a0The last time I posted a job-related ad on Craigslist, I got a lot of nonsense. \u00a0Craigslist is still a great resource, but LinkedIn is better.\u003C\/p\u003E\u003Ch3\u003EProfessional Networking\u003C\/h3\u003E\u003Cp\u003ENetworking isn\u0027t just about getting a job. \u00a0I\u0027ve used LinkedIn to get quality referrals to legal specialists. \u00a0Several groups share industry news. \u00a0I have a friend who posts news articles relevant to his legal practice.\u003C\/p\u003E\u003Cp\u003ESo, LinkedIn is a fantastic tool and I use it on a regular basis. \u00a0That said, there are some things it\u0027s not good at.\u003C\/p\u003E\u003Ch2\u003EWhat It Isn\u0027t\u003C\/h2\u003E\u003Cp\u003ELinkedIn isn\u0027t for your personal life. \u00a0It\u0027s not the place to share bachelor party pictures or your favorite music. \u00a0There\u0027s an expectation that everyone there will act professionally. \u00a0If you wouldn\u0027t do it at an office function, don\u0027t do it on LinkedIn.\u003C\/p\u003E\u003Cp\u003EMost importantly: \u003Cstrong\u003EDon\u0027t befriend strangers\u003C\/strong\u003E. \u00a0LinkedIn is not for meeting people. \u00a0I said above that you can introduced to people through mutual contacts, but that is for the purpose of job hunting or professional referrals. \u00a0It\u0027s not for \u0022hey I see we have shared interests\u0022 or \u0022I\u0027d like to meet you to discuss a business proposal.\u0022 \u00a0It\u0027s worth noting that if you get introduced to someone through LinkedIn, you\u0027re not added to their contact list. \u00a0(Frankly, the same advice goes for Facebook. \u00a0Why would you add a \u0022friend\u0022 who\u0027s not really a friend?)\u003C\/p\u003E\u003Cp\u003EThis isn\u0027t just my opinion; it\u0027s in the \u003Ca href=\u0022https:\/\/www.linkedin.com\/legal\/user-agreement\u0022\u003ELinkedIn User Agreement\u003C\/a\u003E:\u003C\/p\u003E\u003Cblockquote\u003E\u003Ch3 style=\u0022margin-top: 0px; margin-bottom: 0px; outline: 0px; font-style: inherit; font-size: 13px; font-family: inherit; font-variant: inherit; line-height: 17px;\u0022\u003EB. Don\u2019t undertake the following:\u003C\/h3\u003E\u003Cp style=\u0022margin-bottom: 10px; margin-left: 40px; outline: 0px; font-family: Helvetica, FreeSans, \u0027Liberation Sans\u0027, Helmet, Arial, sans-serif; line-height: 17px; list-style-type: decimal; color: rgb(153, 153, 153);\u0022\u003E[...]\u003C\/p\u003E\u003Cp style=\u0022margin-bottom: 10px; margin-left: 40px; outline: 0px; font-family: Helvetica, FreeSans, \u0027Liberation Sans\u0027, Helmet, Arial, sans-serif; line-height: 17px; list-style-type: decimal; color: rgb(153, 153, 153);\u0022\u003E\u003Cspan style=\u0022font-style: inherit; font-variant: inherit;\u0022\u003EInvite people you do not know to join your network\u003C\/span\u003E\u003C\/p\u003E\u003C\/blockquote\u003E\u003Cp\u003EI will only befriend someone if I\u0027d be willing to recommend them professionally. \u00a0I have over 100 contacts in my LinkedIn list and I know every single one of them well enough to say how good they are in their respective professions.\u003C\/p\u003E\u003Cp\u003EYou\u0027d be surprised how many people don\u0027t get that. \u00a0I\u0027ve rejected a lot of connect requests because they came from strangers. \u00a0People seem to think that a larger network is somehow better. \u00a0I had a LinkedIn employee tell me that once I got 100 contacts, \u0022something good would happen\u0022 professionally. \u00a0I responded to that information by\u00a0\u003Cem\u003Eremoving\u00a0\u003C\/em\u003Epeople from my contact list. \u00a0100 crappy contacts are useless. \u00a0100 quality contacts could be very powerful.\u003C\/p\u003E\u003Cp\u003EI recommend you do the same. \u00a0Pare down your contact list to people you actually know well enough to recommend them professionally. \u00a0Refuse new invitations unless you know them well, and don\u0027t send out invitations to others unless you know them well. \u00a0Fill in your profile and work history. \u00a0Join some Groups. \u00a0If you use it poorly, LinkedIn is a waste of time, and honestly, how many professionals have time to waste? \u00a0But used correctly, LinkedIn is a phenomenal tool - and can actually be fun.\u003C\/p\u003E\u003Cp\u003E(If you\u0027ve made it this far, you may as well \u003Ca href=\u0022http:\/\/www.linkedin.com\/in\/koplowicz\/\u0022\u003Echeck out my LinkedIn profile\u003C\/a\u003E.)\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EIt seems odd that I have to post instructions on social networking. \u0026nbsp;If you\u0027re reading this, odds are you\u0027re a web developer with a fair amount of experience. \u0026nbsp;And yet, people don\u0027t seem to understand what to do with LinkedIn.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Ch2\u003EWhat It Is\u003C\/h2\u003E\n\u003Cp\u003EMaybe we should start by talking about what LinkedIn is and what it isn\u0027t. \u0026nbsp;It\u0027s important to realize that\u0026nbsp;\u003Cstrong\u003ELinkedIn is not Facebook\u003C\/strong\u003E. \u0026nbsp;So, what is it?\u003C\/p\u003E\n\u003Cp\u003ELinkedIn is a\u0026nbsp;\u003Cstrong\u003Eprofessional network\u003C\/strong\u003E. \u0026nbsp;That is, it\u0027s a social network of professional contacts. \u0026nbsp;If you fill out your profile, it gives an outline of your skills, job history, and education. \u0026nbsp;Businesses can have an online presence that lists their employees.\u003C\/p\u003E\n\u003Cp\u003ELinkedIn is a tool, and tools need a purpose. \u0026nbsp;LinkedIn has several purposes:\u003C\/p\u003E\n\u003Ch3\u003EFinding a Job\u003C\/h3\u003E\n\u003Cp\u003EWhen I apply for a job, I always use LinkedIn. \u0026nbsp;There are a few different things I can do:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EFigure out if I know someone who works at that company, or if I know someone who knows someone. \u0026nbsp;If you know someone who knows someone, you can request an introduction. \u0026nbsp;I\u0027ve gotten several in-person interviews that way. \u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003ECheck to see if anyone went to the same school as you, then use the alumni connection.\u003C\/li\u003E\n\u003Cli\u003EIf you get an interview, read up on the person who will be interviewing you. \u0026nbsp;What\u0027s their work history? \u0026nbsp;Is their focus technical or managerial? \u0026nbsp;If other people have endorsed their work, what have other people said about them? \u0026nbsp;These are probably character traits that this person values. \u0026nbsp;In the interview you can let them know that you share the same qualities.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou can also get endorsements for current and past work. \u0026nbsp;The best way to do this is to give endorsements of others; your coworkers are likely to reciprocate. \u0026nbsp;In certain industries, you can even upload samples of your own work, like an article in a trade journal that you wrote. \u0026nbsp;Also be sure to link to relevant websites, especially if you have an online portfolio of your own work. \u0026nbsp;When a prospective employer checks out your LinkedIn profile, they\u0027ll see these things.\u003C\/p\u003E\n\u003Cp\u003EAlso, you can put the \u0022social\u0022 back in \u0022social network\u0022 and join a LinkedIn Group. \u0026nbsp;A lot of groups have job listings. \u0026nbsp;At the very least, you can ask for job advice.\u003C\/p\u003E\n\u003Cp\u003EDon\u0027t overlook the power of your existing networks. \u0026nbsp;For example, I\u0027ve been part of a large non-profit for the past 20+ years. \u0026nbsp;I\u0027ve invited other volunteers to connect with me on LinkedIn, because I\u0027m happy to share my professional network with them. \u0026nbsp;Same goes for former coworkers. \u0026nbsp;If Bob has been hired by a better company, he might help you get a job there too. \u0026nbsp;LinkedIn is the place to start.\u003C\/p\u003E\n\u003Cp\u003EFinally, from the \u0022it should be obvious\u0022 department: LinkedIn has job listings. \u0026nbsp;It\u0027ll even email you. \u0026nbsp;Since I switch careers 18 months ago, LinkedIn has been somewhat confused, and now sends me job listings for both attorneys and web developers. \u0026nbsp;But most of the job applications I\u0027ve submitted in the last year have been through LinkedIn. \u0026nbsp;As an added bonus, it already has all of your contact info and employment history, so filling out job apps is actually fast and easy. \u0026nbsp;You can even save cover letters. \u0026nbsp;(Although you shouldn\u0027t - every cover letter should be tailored to the specific job, and ideally you should do some name dropping thanks to your LinkedIn research.)\u003C\/p\u003E\n\u003Ch3\u003EFinding an Employee\u003C\/h3\u003E\n\u003Cp\u003EI just mentioned that LinkedIn does job listings. \u0026nbsp;If I were hiring, I\u0027d start with LinkedIn. \u0026nbsp;Not only does it simplify the application workflow, but you\u0027re going to get much better information on each applicant. \u0026nbsp;In addition, there doesn\u0027t seem to be a lot of spammers on LinkedIn, so you\u0027re more likely to get high quality inquiries. \u0026nbsp;The last time I posted a job-related ad on Craigslist, I got a lot of nonsense. \u0026nbsp;Craigslist is still a great resource, but LinkedIn is better.\u003C\/p\u003E\n\u003Ch3\u003EProfessional Networking\u003C\/h3\u003E\n\u003Cp\u003ENetworking isn\u0027t just about getting a job. \u0026nbsp;I\u0027ve used LinkedIn to get quality referrals to legal specialists. \u0026nbsp;Several groups share industry news. \u0026nbsp;I have a friend who posts news articles relevant to his legal practice.\u003C\/p\u003E\n\u003Cp\u003ESo, LinkedIn is a fantastic tool and I use it on a regular basis. \u0026nbsp;That said, there are some things it\u0027s not good at.\u003C\/p\u003E\n\u003Ch2\u003EWhat It Isn\u0027t\u003C\/h2\u003E\n\u003Cp\u003ELinkedIn isn\u0027t for your personal life. \u0026nbsp;It\u0027s not the place to share bachelor party pictures or your favorite music. \u0026nbsp;There\u0027s an expectation that everyone there will act professionally. \u0026nbsp;If you wouldn\u0027t do it at an office function, don\u0027t do it on LinkedIn.\u003C\/p\u003E\n\u003Cp\u003EMost importantly: \u003Cstrong\u003EDon\u0027t befriend strangers\u003C\/strong\u003E. \u0026nbsp;LinkedIn is not for meeting people. \u0026nbsp;I said above that you can introduced to people through mutual contacts, but that is for the purpose of job hunting or professional referrals. \u0026nbsp;It\u0027s not for \u0022hey I see we have shared interests\u0022 or \u0022I\u0027d like to meet you to discuss a business proposal.\u0022 \u0026nbsp;It\u0027s worth noting that if you get introduced to someone through LinkedIn, you\u0027re not added to their contact list. \u0026nbsp;(Frankly, the same advice goes for Facebook. \u0026nbsp;Why would you add a \u0022friend\u0022 who\u0027s not really a friend?)\u003C\/p\u003E\n\u003Cp\u003EThis isn\u0027t just my opinion; it\u0027s in the \u003Ca href=\u0022https:\/\/www.linkedin.com\/legal\/user-agreement\u0022\u003ELinkedIn User Agreement\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Ch3 style=\u0022margin-top: 0px; margin-bottom: 0px; outline: 0px; font-style: inherit; font-size: 13px; font-family: inherit; font-variant: inherit; line-height: 17px;\u0022\u003EB. Don\u2019t undertake the following:\u003C\/h3\u003E\n\u003Cp style=\u0022margin-bottom: 10px; margin-left: 40px; outline: 0px; font-family: Helvetica, FreeSans, \u0027Liberation Sans\u0027, Helmet, Arial, sans-serif; line-height: 17px; list-style-type: decimal; color: rgb(153, 153, 153);\u0022\u003E[...]\u003C\/p\u003E\n\u003Cp style=\u0022margin-bottom: 10px; margin-left: 40px; outline: 0px; font-family: Helvetica, FreeSans, \u0027Liberation Sans\u0027, Helmet, Arial, sans-serif; line-height: 17px; list-style-type: decimal; color: rgb(153, 153, 153);\u0022\u003E\u003Cspan style=\u0022font-style: inherit; font-variant: inherit;\u0022\u003EInvite people you do not know to join your network\u003C\/span\u003E\u003C\/p\u003E\n\u003C\/blockquote\u003E\n\u003Cp\u003EI will only befriend someone if I\u0027d be willing to recommend them professionally. \u0026nbsp;I have over 100 contacts in my LinkedIn list and I know every single one of them well enough to say how good they are in their respective professions.\u003C\/p\u003E\n\u003Cp\u003EYou\u0027d be surprised how many people don\u0027t get that. \u0026nbsp;I\u0027ve rejected a lot of connect requests because they came from strangers. \u0026nbsp;People seem to think that a larger network is somehow better. \u0026nbsp;I had a LinkedIn employee tell me that once I got 100 contacts, \u0022something good would happen\u0022 professionally. \u0026nbsp;I responded to that information by\u0026nbsp;\u003Cem\u003Eremoving\u0026nbsp;\u003C\/em\u003Epeople from my contact list. \u0026nbsp;100 crappy contacts are useless. \u0026nbsp;100 quality contacts could be very powerful.\u003C\/p\u003E\n\u003Cp\u003EI recommend you do the same. \u0026nbsp;Pare down your contact list to people you actually know well enough to recommend them professionally. \u0026nbsp;Refuse new invitations unless you know them well, and don\u0027t send out invitations to others unless you know them well. \u0026nbsp;Fill in your profile and work history. \u0026nbsp;Join some Groups. \u0026nbsp;If you use it poorly, LinkedIn is a waste of time, and honestly, how many professionals have time to waste? \u0026nbsp;But used correctly, LinkedIn is a phenomenal tool - and can actually be fun.\u003C\/p\u003E\n\u003Cp\u003E(If you\u0027ve made it this far, you may as well \u003Ca href=\u0022http:\/\/www.linkedin.com\/in\/koplowicz\/\u0022\u003Echeck out my LinkedIn profile\u003C\/a\u003E.)\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1368919878,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":28}],"uuid":[{"value":"df751a7a-4494-4d37-a531-7d481ce6999b"}],"vid":[{"value":364}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2022-01-05T16:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Drupal: Getting Started"}],"created":[{"value":"2013-05-14T20:11:32+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2022-01-05T16:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/drupal-getting-started","pid":62,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ESomething\u0027s been concerning me lately: How can we simultaneously have high unemployment and a huge, unmet demand for web designers? \u00a0This stuff is not that hard. \u00a0I never went to school, I don\u0027t have any certifications in web design. \u00a0Sure I\u0027m smart, but so are all my friends.\u003C\/p\u003E\u003Cp\u003EI think part of the answer is that web design is considered magic, just like legal practice (which I\u0027ve also done). \u00a0There\u0027s a huge aura of mystique surrounding the whole thing and everyone is\u00a0\u003Cem\u003Econvinced\u003C\/em\u003E it\u0027s hard. \u00a0It\u0027s not, I swear! \u00a0In order to be a good web designer, all you need is two things:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003EDon\u0027t be completely stupid\u003C\/li\u003E\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBe willing to put in the effort\u003C\/span\u003E\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EThat\u0027s pretty much it. \u00a0Most of the web designers I know make six figures without working too hard. \u00a0It sure beats unemployment - I\u0027m speaking from experience.\u003C\/p\u003E\u003Ch2\u003EHow Do I Start?\u003C\/h2\u003E\u003Cp\u003EThat\u0027s actually a really good question. \u00a0I just started playing around on my own and after years of trial and error, finally figured out what I was doing. \u00a0But there actually are learning resources out there. \u00a0If you want to learn, and are willing to put in the effort, here\u0027s a good rundown on things that will help:\u003C\/p\u003E\u003Ch3\u003EDrupal Coding Rocks\u003C\/h3\u003E\u003Cp\u003EThis is a relatively new site. \u00a0They only have a couple courses up so far, but you get the first 8 week course for free. \u00a0You want an in-depth Drupal tutorial and don\u0027t want to drop any money? \u00a0Start here. \u00a0\u003Ca href=\u0022http:\/\/drupalcodingrocks.com\/\u0022 style=\u0022line-height: 1.538em;\u0022\u003Edrupalcodingrocks.com\u003C\/a\u003E\u003C\/p\u003E\u003Ch3\u003EBuildaModule.com\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/buildamodule.com\/\u0022\u003EBuildaModule.com\u003C\/a\u003E is a learning site dedicated to Drupal. \u00a0It\u0027s got a wonderful set of video tutorials. \u00a0It starts from the very basics and works its way up in a consistent way. \u00a0There\u0027s a narrative and it lets you build on your previous work. \u00a0The first set of videos is titled \u0022Build Your First Drupal 7 Web Site\u0022 and is 10 hours long. \u00a0Perfect.\u003C\/p\u003E\u003Cp\u003EThis is a paid site but well worth the money. \u00a0When people ask \u0022what\u0027s a good resource for Drupal,\u0022 this is always the first name to come up.\u003C\/p\u003E\u003Ch3\u003EDrupalize.me\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/drupalize.me\/\u0022\u003EDrupalize.me\u003C\/a\u003E\u00a0is a collection of training videos from Lullabot, a local Drupal design firm (and one of the largest in the country). \u00a0Slightly more expensive than BuildaModule.com (see above), and it\u0027s from a design firm, rather than being dedicated to Drupal education. \u00a0But Lullabot is an excellent company and their training videos have the same high reputation.\u003C\/p\u003E\u003Ch3\u003ELynda.com\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022http:\/\/Lynda.com\u0022\u003ELynda.com\u00a0\u003C\/a\u003Eis a general-purpose online learning site. \u00a0They\u0027ve got videos on how to do lots of stuff in Drupal, everything from beginner level to advanced. \u00a0I\u0027ve heard people praise Lynda. \u00a0This is a paid site but worth the money.\u003C\/p\u003E\u003Ch3\u003EBook: Using Drupal\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022http:\/\/usingdrupal.com\/\u0022\u003Eusingdrupal.com\u003C\/a\u003E\u003C\/p\u003E\u003Cp\u003EThis is an O\u0027Reilly book, one of the ones with an animal on the cover. \u00a0O\u0027Reilly is your #1 source for books on computer stuff. \u00a0I\u0027ve used a couple of their books to learn programming languages and have been completely satisfied. \u00a0This book is for beginners. \u00a0If you\u0027re one of those old fashioned people who likes to learn from a book, this is your best bet. \u00a0Definitely worth the money.\u003C\/p\u003E\u003Ch3\u003EDrupal.org Forums\u003C\/h3\u003E\u003Cp\u003EIf you have a question, \u003Ca href=\u0022https:\/\/www.drupal.org\/forum\u0022\u003Eask in the forums\u003C\/a\u003E. \u00a0There\u0027s a very large and active Drupal community. \u00a0Remember, everything here is open source, which mean knowledge is free. \u00a0Drupal developers love to share. \u00a0Stack Exchange also has \u003Ca href=\u0022https:\/\/drupal.stackexchange.com\/\u0022\u003Ea nice section set aside for Drupal\u003C\/a\u003E. \u00a0If all else fails, you can also google it.\u003C\/p\u003E\u003Cp\u003EIf you\u0027re afraid to look things up, then you\u0027re not really willing to put in the effort, and web design isn\u0027t for you. \u00a0But if you\u0027re willing to put in a little effort, you\u0027ll find that all your questions have already been answered.\u003C\/p\u003E\u003Ch3\u003EMeetups\u003C\/h3\u003E\u003Cp\u003ENothing beats in-person contact. \u00a0The Bay Area has a large and vibrant Drupal community. \u00a0There are several \u0022Drupal Camps\u0022 every year, in \u003Ca href=\u0022http:\/\/2013.badcamp.net\/\u0022\u003EBerkeley\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/webcamp.stanford.edu\u0022\u003EStanford\u003C\/a\u003E, and \u003Ca href=\u0022https:\/\/sacdrupal.org\/\u0022\u003ESacramento\u003C\/a\u003E. \u00a0There are also meetups all over the Bay, including the \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/\u0022\u003ESan Francisco Drupal Users Group\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/events\/99180202\/\u0022\u003EUsers Helping Users\u003C\/a\u003E (which I run). \u00a0Check \u003Ca href=\u0022https:\/\/www.meetup.com\/\u0022\u003EMeetup.com\u003C\/a\u003E for more.\u003C\/p\u003E\u003Cp\u003ENot only is this the best way to get your questions answered, but it\u0027s also the best way to find a job. \u00a0Within months of becoming a regular at the meetups, I was getting paid work. \u00a0I\u0027ve doubled my income in the last year, thanks to the meetups.\u003C\/p\u003E\u003Ch2\u003EJump In\u003C\/h2\u003E\u003Cp\u003EI didn\u0027t learn by reading a manual and I\u0027ve never paid for a training video. \u00a0I learn by doing. \u00a0Yes, that involves a lot of mistakes, but some people prefer to learn the hard way. \u00a0If you just want to start clicking and see what happens, here are some resources for you:\u003C\/p\u003E\u003Ch3\u003EDrupal Gardens\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022http:\/\/www.drupalgardens.com\/\u0022\u003Edrupalgardens.com\u003C\/a\u003E\u003C\/p\u003E\u003Cp\u003EWant to just jump in and start clicking? \u00a0Go for it. \u00a0Drupal Gardens is provided by Acquia, the largest Drupal company in the world. \u00a0\u003Cstrong\u003EIT\u0027S FREE\u003C\/strong\u003E. \u00a0Jump in and have fun.\u003C\/p\u003E\u003Ch3\u003EPantheon\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E is a Drupal host geared toward high performance. \u00a0It\u0027s not cheap, but\u00a0\u003Cstrong\u003Edevelopment is free\u003C\/strong\u003E. \u00a0That means you can set up a new Drupal site (or one of several popular variants) and start playing for free. \u00a0It comes with a full development workflow, including development, testing, and live, sftp, git, and drush support. \u00a0For free! \u00a0You don\u0027t pay until you go live. \u00a0This is definitely more advanced than Drupal Gardens, but gives you a taste of advanced development when you\u0027re ready.\u003C\/p\u003E\u003Ch3\u003EHostGator\u003C\/h3\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003EHostGator\u003C\/a\u003E is my own web host. \u00a0They offer a basic hosting package for \u003Cstrong\u003Eless than $5\/month\u003C\/strong\u003E. \u00a0They have one-click installation for Drupal, and support for ssh, sftp, drush, and git. \u00a0I\u0027ve done half of my professional development on HostGator and I\u0027m very pleased with them. \u00a0You can start your own site and use it as a showcase for your talents. \u00a0It\u0027s not high-performance like Pantheon, but for live sites it\u0027s a lot cheaper.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ENow go for it.\u003C\/strong\u003E\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ESomething\u0027s been concerning me lately: How can we simultaneously have high unemployment and a huge, unmet demand for web designers? \u0026nbsp;This stuff is not that hard. \u0026nbsp;I never went to school, I don\u0027t have any certifications in web design. \u0026nbsp;Sure I\u0027m smart, but so are all my friends.\u003C\/p\u003E\n\u003Cp\u003EI think part of the answer is that web design is considered magic, just like legal practice (which I\u0027ve also done). \u0026nbsp;There\u0027s a huge aura of mystique surrounding the whole thing and everyone is\u0026nbsp;\u003Cem\u003Econvinced\u003C\/em\u003E it\u0027s hard. \u0026nbsp;It\u0027s not, I swear! \u0026nbsp;In order to be a good web designer, all you need is two things:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003EDon\u0027t be completely stupid\u003C\/li\u003E\n\u003Cli\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBe willing to put in the effort\u003C\/span\u003E\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EThat\u0027s pretty much it. \u0026nbsp;Most of the web designers I know make six figures without working too hard. \u0026nbsp;It sure beats unemployment - I\u0027m speaking from experience.\u003C\/p\u003E\n\u003Ch2\u003EHow Do I Start?\u003C\/h2\u003E\n\u003Cp\u003EThat\u0027s actually a really good question. \u0026nbsp;I just started playing around on my own and after years of trial and error, finally figured out what I was doing. \u0026nbsp;But there actually are learning resources out there. \u0026nbsp;If you want to learn, and are willing to put in the effort, here\u0027s a good rundown on things that will help:\u003C\/p\u003E\n\u003Ch3\u003EDrupal Coding Rocks\u003C\/h3\u003E\n\u003Cp\u003EThis is a relatively new site. \u0026nbsp;They only have a couple courses up so far, but you get the first 8 week course for free. \u0026nbsp;You want an in-depth Drupal tutorial and don\u0027t want to drop any money? \u0026nbsp;Start here. \u0026nbsp;\u003Ca href=\u0022http:\/\/drupalcodingrocks.com\/\u0022 style=\u0022line-height: 1.538em;\u0022\u003Edrupalcodingrocks.com\u003C\/a\u003E\u003C\/p\u003E\n\u003Ch3\u003EBuildaModule.com\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/buildamodule.com\/\u0022\u003EBuildaModule.com\u003C\/a\u003E is a learning site dedicated to Drupal. \u0026nbsp;It\u0027s got a wonderful set of video tutorials. \u0026nbsp;It starts from the very basics and works its way up in a consistent way. \u0026nbsp;There\u0027s a narrative and it lets you build on your previous work. \u0026nbsp;The first set of videos is titled \u0022Build Your First Drupal 7 Web Site\u0022 and is 10 hours long. \u0026nbsp;Perfect.\u003C\/p\u003E\n\u003Cp\u003EThis is a paid site but well worth the money. \u0026nbsp;When people ask \u0022what\u0027s a good resource for Drupal,\u0022 this is always the first name to come up.\u003C\/p\u003E\n\u003Ch3\u003EDrupalize.me\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/drupalize.me\/\u0022\u003EDrupalize.me\u003C\/a\u003E\u0026nbsp;is a collection of training videos from Lullabot, a local Drupal design firm (and one of the largest in the country). \u0026nbsp;Slightly more expensive than BuildaModule.com (see above), and it\u0027s from a design firm, rather than being dedicated to Drupal education. \u0026nbsp;But Lullabot is an excellent company and their training videos have the same high reputation.\u003C\/p\u003E\n\u003Ch3\u003ELynda.com\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022http:\/\/Lynda.com\u0022\u003ELynda.com\u0026nbsp;\u003C\/a\u003Eis a general-purpose online learning site. \u0026nbsp;They\u0027ve got videos on how to do lots of stuff in Drupal, everything from beginner level to advanced. \u0026nbsp;I\u0027ve heard people praise Lynda. \u0026nbsp;This is a paid site but worth the money.\u003C\/p\u003E\n\u003Ch3\u003EBook: Using Drupal\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022http:\/\/usingdrupal.com\/\u0022\u003Eusingdrupal.com\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EThis is an O\u0027Reilly book, one of the ones with an animal on the cover. \u0026nbsp;O\u0027Reilly is your #1 source for books on computer stuff. \u0026nbsp;I\u0027ve used a couple of their books to learn programming languages and have been completely satisfied. \u0026nbsp;This book is for beginners. \u0026nbsp;If you\u0027re one of those old fashioned people who likes to learn from a book, this is your best bet. \u0026nbsp;Definitely worth the money.\u003C\/p\u003E\n\u003Ch3\u003EDrupal.org Forums\u003C\/h3\u003E\n\u003Cp\u003EIf you have a question, \u003Ca href=\u0022https:\/\/www.drupal.org\/forum\u0022\u003Eask in the forums\u003C\/a\u003E. \u0026nbsp;There\u0027s a very large and active Drupal community. \u0026nbsp;Remember, everything here is open source, which mean knowledge is free. \u0026nbsp;Drupal developers love to share. \u0026nbsp;Stack Exchange also has \u003Ca href=\u0022https:\/\/drupal.stackexchange.com\/\u0022\u003Ea nice section set aside for Drupal\u003C\/a\u003E. \u0026nbsp;If all else fails, you can also google it.\u003C\/p\u003E\n\u003Cp\u003EIf you\u0027re afraid to look things up, then you\u0027re not really willing to put in the effort, and web design isn\u0027t for you. \u0026nbsp;But if you\u0027re willing to put in a little effort, you\u0027ll find that all your questions have already been answered.\u003C\/p\u003E\n\u003Ch3\u003EMeetups\u003C\/h3\u003E\n\u003Cp\u003ENothing beats in-person contact. \u0026nbsp;The Bay Area has a large and vibrant Drupal community. \u0026nbsp;There are several \u0022Drupal Camps\u0022 every year, in \u003Ca href=\u0022http:\/\/2013.badcamp.net\/\u0022\u003EBerkeley\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/webcamp.stanford.edu\u0022\u003EStanford\u003C\/a\u003E, and \u003Ca href=\u0022https:\/\/sacdrupal.org\/\u0022\u003ESacramento\u003C\/a\u003E. \u0026nbsp;There are also meetups all over the Bay, including the \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/\u0022\u003ESan Francisco Drupal Users Group\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/www.meetup.com\/SFDUG-San-Francisco-Drupal-Users-group\/events\/99180202\/\u0022\u003EUsers Helping Users\u003C\/a\u003E (which I run). \u0026nbsp;Check \u003Ca href=\u0022https:\/\/www.meetup.com\/\u0022\u003EMeetup.com\u003C\/a\u003E for more.\u003C\/p\u003E\n\u003Cp\u003ENot only is this the best way to get your questions answered, but it\u0027s also the best way to find a job. \u0026nbsp;Within months of becoming a regular at the meetups, I was getting paid work. \u0026nbsp;I\u0027ve doubled my income in the last year, thanks to the meetups.\u003C\/p\u003E\n\u003Ch2\u003EJump In\u003C\/h2\u003E\n\u003Cp\u003EI didn\u0027t learn by reading a manual and I\u0027ve never paid for a training video. \u0026nbsp;I learn by doing. \u0026nbsp;Yes, that involves a lot of mistakes, but some people prefer to learn the hard way. \u0026nbsp;If you just want to start clicking and see what happens, here are some resources for you:\u003C\/p\u003E\n\u003Ch3\u003EDrupal Gardens\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022http:\/\/www.drupalgardens.com\/\u0022\u003Edrupalgardens.com\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EWant to just jump in and start clicking? \u0026nbsp;Go for it. \u0026nbsp;Drupal Gardens is provided by Acquia, the largest Drupal company in the world. \u0026nbsp;\u003Cstrong\u003EIT\u0027S FREE\u003C\/strong\u003E. \u0026nbsp;Jump in and have fun.\u003C\/p\u003E\n\u003Ch3\u003EPantheon\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E is a Drupal host geared toward high performance. \u0026nbsp;It\u0027s not cheap, but\u0026nbsp;\u003Cstrong\u003Edevelopment is free\u003C\/strong\u003E. \u0026nbsp;That means you can set up a new Drupal site (or one of several popular variants) and start playing for free. \u0026nbsp;It comes with a full development workflow, including development, testing, and live, sftp, git, and drush support. \u0026nbsp;For free! \u0026nbsp;You don\u0027t pay until you go live. \u0026nbsp;This is definitely more advanced than Drupal Gardens, but gives you a taste of advanced development when you\u0027re ready.\u003C\/p\u003E\n\u003Ch3\u003EHostGator\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003EHostGator\u003C\/a\u003E is my own web host. \u0026nbsp;They offer a basic hosting package for \u003Cstrong\u003Eless than $5\/month\u003C\/strong\u003E. \u0026nbsp;They have one-click installation for Drupal, and support for ssh, sftp, drush, and git. \u0026nbsp;I\u0027ve done half of my professional development on HostGator and I\u0027m very pleased with them. \u0026nbsp;You can start your own site and use it as a showcase for your talents. \u0026nbsp;It\u0027s not high-performance like Pantheon, but for live sites it\u0027s a lot cheaper.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ENow go for it.\u003C\/strong\u003E\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1641398401,"last_comment_name":"","last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":27}],"uuid":[{"value":"de6f2ae8-d5e8-4ad1-8a7b-dd821e536f4f"}],"vid":[{"value":27}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2013-04-26T18:02:36+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Learning from the Rubble"}],"created":[{"value":"2013-04-26T18:02:36+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2013-04-26T18:02:36+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/learning-rubble","pid":61,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI just had a website blow up on me. \u0026nbsp;Five months of work and a good deal of it suddenly gone, right as I was trying to launch. \u0026nbsp;Here\u0027s what I learned from the experience.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Ch2\u003EVersion Control\u003C\/h2\u003E\u003Cp\u003EI originally wanted to turn on git for this project, but the web host (Bluehost) wouldn\u0027t allow it. \u0026nbsp;Theoretically it\u0027s possible, but I kept getting \u0022out of memory\u0022 errors. \u0026nbsp;Granted, it was a large project with a lot of files, but not\u0026nbsp;\u003Cem\u003Ethat\u0026nbsp;\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Ehuge. \u0026nbsp;I suspect the host had pretty strict memory limits. \u0026nbsp;I sunk about an hour into this task and then gave up and moved on. \u0026nbsp;We had urgent tasks to attend to and this was a distraction.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut, of course, git is not a distraction. \u0026nbsp;Git is your workflow. \u0026nbsp;Git is important. \u0026nbsp;When youi break something, git is there to save you. \u0026nbsp;Generally speaking, git means your files are in more than one place. \u0026nbsp;So when a server explodes, it\u0027s okay because you\u0027ve got all the data stored locally. \u0026nbsp;If I had insisted on getting git running, that single act would have saved me when the server blew up.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDo Your Own Backups\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIn fact, my client told me to do this. \u0026nbsp;I looked into the automated backups provided by the web host and concluded that they were sufficient: the web host provided automatic daily, weekly, and monthly backups. \u0026nbsp;I trusted them.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI shouldn\u0027t have.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EWhen the site exploded and we needed to restore from backup, we discovered to our horror that the backups were missing a lot of files, especially inside subdirectories. \u0026nbsp;Well, this is Drupal. \u0026nbsp;There are a lot of subdirectories. \u0026nbsp;Most painfully, we lost most of the custom theme we\u0027d been working on for five months, including the main CSS style sheet.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAgain, I knew better than to rely on the web host. \u0026nbsp;Manual backups are a standard part of my workflow. \u0026nbsp;But in this case, we had easily a terabyte and a half of data that I would have had to download. \u0026nbsp;It was late, I was tired, and I wanted to put the site online and get on with my life. \u0026nbsp;So I cut a corner. \u0026nbsp;If I had done this one thing, I could have prevented this tragedy.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDon\u0027t Do Important Things When You\u0027re Tired\u003C\/span\u003E\u003C\/h2\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis saga played out over a two day period. \u0026nbsp;On both days, I didn\u0027t even start work until after 10 pm. \u0026nbsp;I\u0027m not a night owl any more; it\u0027s hard to stay up late every night when you have to take the kids to daycare at 7 am. \u0026nbsp;A lot of web developers still live like college students, but that doesn\u0027t work for me any more. \u0026nbsp;Maybe that\u0027s a disadvantage, but you work with what you\u0027ve got.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENaturally, I do plenty of work when I\u0027m tired. \u0026nbsp;But in this case, I took dangerous risks at a critical stage of deployment. \u0026nbsp;While half asleep.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe late hour and my own fatigue contributed directly to the failure. \u0026nbsp;If it had been 10 am and if I had been well rested, I would have insisted on running a manual backup before trying to deploy. \u0026nbsp;But it was late and I was anxious to go to bed, so I cut corners.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EPart of the reason I agreed to work like that was because the client requested it. \u0026nbsp;He was facing a deadline and didn\u0027t want to tell\u0026nbsp;\u003Cem\u003Ehis\u003C\/em\u003E clients that they would have to wait one more day. \u0026nbsp;I agreed to work under those conditions in order to help him meet his deadline. \u0026nbsp;I went against my own advice and now the site won\u0027t be ready for another week or two.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe lesson: When you\u0027re tired, go to bed. \u0026nbsp;If you miss the deadline, you miss the deadline. \u0026nbsp;You\u0027re setting yourself up for much worse harm if you push yourself too far. \u0026nbsp;You know yourself better than the client knows you, and you need to know when to call it a night.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\u003Ch2\u003EDon\u0027t Use Bluehost\u003C\/h2\u003E\u003Cp\u003EMy client would disagree with this. \u0026nbsp;He\u0027s used Bluehost for years and never had this kind of problem before. \u0026nbsp;I know they\u0027re one of the more popular shared hosts for small Drupal sites. \u0026nbsp;But so far, my experience with them has been terrible:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EVery low server resources have led to performance issues (even compared with other low budget shared hosts)\u003C\/li\u003E\u003Cli\u003ENo git support\u003C\/li\u003E\u003Cli\u003EBackups failed when I needed them\u003C\/li\u003E\u003Cli\u003EThird tier tech support won\u0027t talk to you (that might be standard but still not a point in their favor)\u003C\/li\u003E\u003Cli\u003ELousy support for top-level\u0026nbsp;domains\u003C\/li\u003E\u003Cli\u003ETool for managing sub-domains didn\u0027t work\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ETo be sure, there are some nice things about Bluehost, but nothing that I couldn\u0027t have gotten with Hostgator or any number of other hosts. \u0026nbsp;I\u0027ve been with Hostgator for years now and have been much happier with them. \u0026nbsp;I\u0027ve built much more demanding sites than this, and have gone through much trickier deployments, and have never experienced this kind of problem. \u0026nbsp;I will never willingly use Bluehost again.\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\u003Ch2\u003EStick To Your Guns\u003C\/h2\u003E\u003Cp\u003EA lot of the above lessons ended with \u0022I knew it was a bad idea but did it anyway.\u0022 \u0026nbsp;The lesson here is: If you know it\u0027s a bad idea,\u0026nbsp;\u003Cstrong\u003E\u003Cem\u003Edon\u0027t do it.\u003C\/em\u003E\u003C\/strong\u003E \u0026nbsp;The client and I were both eager to meet a deadline and we blinded ourselves to the risks of cutting corners. \u0026nbsp;I was only a subcontractor on this project; I had no vested interest in the outcome, aside from making the client happy. \u0026nbsp;To be sure, I\u0027ve had a very positive relationship with this client for a long time, spanning multiple projects. \u0026nbsp;But that\u0027s all the more reason to stick to your guns. \u0026nbsp;I did him a disservice by ignoring my own advice.\u003C\/p\u003E\u003Cp\u003ESetting up a proper workflow - and sticking to it - takes a lot of extra time, and there is a strong temptation to just dive in and start working. \u0026nbsp;But being a mature professional means having the discipline to hold your horses back and lay the proper groundwork first. \u0026nbsp;I think \u0022discipline\u0022 is the real key word here. \u0026nbsp;Be careful and deliberate, and\u0026nbsp;\u003Cem\u003Edisciplined\u003C\/em\u003E, and you can save yourself from a lot of misery.\u003C\/p\u003E\u003Cp\u003EUnfortunately, I\u0027m one of those people who has to learn things the hard way. \u0026nbsp;Now I\u0027m donating my time to help the client repair the site; my mistakes have cost me time and money. \u0026nbsp;But I\u0026nbsp;\u003Cem\u003Ehave\u003C\/em\u003E learned my lesson. \u0026nbsp;Not just about setting up a proper workflow, but about being careful, deliberate, and above all\u0026nbsp;\u003Cem\u003Ediscplined\u003C\/em\u003E. \u0026nbsp;And now I have the experience to back it up. \u0026nbsp;That\u0027s what makes a good developer.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI just had a website blow up on me. \u0026nbsp;Five months of work and a good deal of it suddenly gone, right as I was trying to launch. \u0026nbsp;Here\u0027s what I learned from the experience.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Ch2\u003EVersion Control\u003C\/h2\u003E\n\u003Cp\u003EI originally wanted to turn on git for this project, but the web host (Bluehost) wouldn\u0027t allow it. \u0026nbsp;Theoretically it\u0027s possible, but I kept getting \u0022out of memory\u0022 errors. \u0026nbsp;Granted, it was a large project with a lot of files, but not\u0026nbsp;\u003Cem\u003Ethat\u0026nbsp;\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Ehuge. \u0026nbsp;I suspect the host had pretty strict memory limits. \u0026nbsp;I sunk about an hour into this task and then gave up and moved on. \u0026nbsp;We had urgent tasks to attend to and this was a distraction.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut, of course, git is not a distraction. \u0026nbsp;Git is your workflow. \u0026nbsp;Git is important. \u0026nbsp;When youi break something, git is there to save you. \u0026nbsp;Generally speaking, git means your files are in more than one place. \u0026nbsp;So when a server explodes, it\u0027s okay because you\u0027ve got all the data stored locally. \u0026nbsp;If I had insisted on getting git running, that single act would have saved me when the server blew up.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDo Your Own Backups\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIn fact, my client told me to do this. \u0026nbsp;I looked into the automated backups provided by the web host and concluded that they were sufficient: the web host provided automatic daily, weekly, and monthly backups. \u0026nbsp;I trusted them.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI shouldn\u0027t have.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EWhen the site exploded and we needed to restore from backup, we discovered to our horror that the backups were missing a lot of files, especially inside subdirectories. \u0026nbsp;Well, this is Drupal. \u0026nbsp;There are a lot of subdirectories. \u0026nbsp;Most painfully, we lost most of the custom theme we\u0027d been working on for five months, including the main CSS style sheet.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EAgain, I knew better than to rely on the web host. \u0026nbsp;Manual backups are a standard part of my workflow. \u0026nbsp;But in this case, we had easily a terabyte and a half of data that I would have had to download. \u0026nbsp;It was late, I was tired, and I wanted to put the site online and get on with my life. \u0026nbsp;So I cut a corner. \u0026nbsp;If I had done this one thing, I could have prevented this tragedy.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EDon\u0027t Do Important Things When You\u0027re Tired\u003C\/span\u003E\u003C\/h2\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis saga played out over a two day period. \u0026nbsp;On both days, I didn\u0027t even start work until after 10 pm. \u0026nbsp;I\u0027m not a night owl any more; it\u0027s hard to stay up late every night when you have to take the kids to daycare at 7 am. \u0026nbsp;A lot of web developers still live like college students, but that doesn\u0027t work for me any more. \u0026nbsp;Maybe that\u0027s a disadvantage, but you work with what you\u0027ve got.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ENaturally, I do plenty of work when I\u0027m tired. \u0026nbsp;But in this case, I took dangerous risks at a critical stage of deployment. \u0026nbsp;While half asleep.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe late hour and my own fatigue contributed directly to the failure. \u0026nbsp;If it had been 10 am and if I had been well rested, I would have insisted on running a manual backup before trying to deploy. \u0026nbsp;But it was late and I was anxious to go to bed, so I cut corners.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EPart of the reason I agreed to work like that was because the client requested it. \u0026nbsp;He was facing a deadline and didn\u0027t want to tell\u0026nbsp;\u003Cem\u003Ehis\u003C\/em\u003E clients that they would have to wait one more day. \u0026nbsp;I agreed to work under those conditions in order to help him meet his deadline. \u0026nbsp;I went against my own advice and now the site won\u0027t be ready for another week or two.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe lesson: When you\u0027re tired, go to bed. \u0026nbsp;If you miss the deadline, you miss the deadline. \u0026nbsp;You\u0027re setting yourself up for much worse harm if you push yourself too far. \u0026nbsp;You know yourself better than the client knows you, and you need to know when to call it a night.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EDon\u0027t Use Bluehost\u003C\/h2\u003E\n\u003Cp\u003EMy client would disagree with this. \u0026nbsp;He\u0027s used Bluehost for years and never had this kind of problem before. \u0026nbsp;I know they\u0027re one of the more popular shared hosts for small Drupal sites. \u0026nbsp;But so far, my experience with them has been terrible:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EVery low server resources have led to performance issues (even compared with other low budget shared hosts)\u003C\/li\u003E\n\u003Cli\u003ENo git support\u003C\/li\u003E\n\u003Cli\u003EBackups failed when I needed them\u003C\/li\u003E\n\u003Cli\u003EThird tier tech support won\u0027t talk to you (that might be standard but still not a point in their favor)\u003C\/li\u003E\n\u003Cli\u003ELousy support for top-level\u0026nbsp;domains\u003C\/li\u003E\n\u003Cli\u003ETool for managing sub-domains didn\u0027t work\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ETo be sure, there are some nice things about Bluehost, but nothing that I couldn\u0027t have gotten with Hostgator or any number of other hosts. \u0026nbsp;I\u0027ve been with Hostgator for years now and have been much happier with them. \u0026nbsp;I\u0027ve built much more demanding sites than this, and have gone through much trickier deployments, and have never experienced this kind of problem. \u0026nbsp;I will never willingly use Bluehost again.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EStick To Your Guns\u003C\/h2\u003E\n\u003Cp\u003EA lot of the above lessons ended with \u0022I knew it was a bad idea but did it anyway.\u0022 \u0026nbsp;The lesson here is: If you know it\u0027s a bad idea,\u0026nbsp;\u003Cstrong\u003E\u003Cem\u003Edon\u0027t do it.\u003C\/em\u003E\u003C\/strong\u003E \u0026nbsp;The client and I were both eager to meet a deadline and we blinded ourselves to the risks of cutting corners. \u0026nbsp;I was only a subcontractor on this project; I had no vested interest in the outcome, aside from making the client happy. \u0026nbsp;To be sure, I\u0027ve had a very positive relationship with this client for a long time, spanning multiple projects. \u0026nbsp;But that\u0027s all the more reason to stick to your guns. \u0026nbsp;I did him a disservice by ignoring my own advice.\u003C\/p\u003E\n\u003Cp\u003ESetting up a proper workflow - and sticking to it - takes a lot of extra time, and there is a strong temptation to just dive in and start working. \u0026nbsp;But being a mature professional means having the discipline to hold your horses back and lay the proper groundwork first. \u0026nbsp;I think \u0022discipline\u0022 is the real key word here. \u0026nbsp;Be careful and deliberate, and\u0026nbsp;\u003Cem\u003Edisciplined\u003C\/em\u003E, and you can save yourself from a lot of misery.\u003C\/p\u003E\n\u003Cp\u003EUnfortunately, I\u0027m one of those people who has to learn things the hard way. \u0026nbsp;Now I\u0027m donating my time to help the client repair the site; my mistakes have cost me time and money. \u0026nbsp;But I\u0026nbsp;\u003Cem\u003Ehave\u003C\/em\u003E learned my lesson. \u0026nbsp;Not just about setting up a proper workflow, but about being careful, deliberate, and above all\u0026nbsp;\u003Cem\u003Ediscplined\u003C\/em\u003E. \u0026nbsp;And now I have the experience to back it up. \u0026nbsp;That\u0027s what makes a good developer.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1366999356,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":24}],"uuid":[{"value":"0f336829-98d2-41fc-9e30-009d6f6c02ca"}],"vid":[{"value":348}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2020-03-31T18:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Password security: Why You\u0027re Doing It Wrong (and How To Do It Right)"}],"created":[{"value":"2013-03-30T18:37:51+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2020-03-31T18:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/password-security-why-youre-doing-it-wrong-and-how-do-it-right","pid":57,"langcode":"und"}],"body":[{"value":"\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ERight now, you have probably given all your sensitive information to two of three large companies. \u00a0They are Facebook, Google, and Yahoo. \u00a0Of the three, Google has the best security. \u00a0Facebook is okay, and Yahoo is terrible. \u00a0Let\u0027s see why.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EFacebook: 3 Stars\u003C\/h2\u003E\u003Cp\u003EYesterday, Facebook froze my account because someone had tried to hack it from Thailand. \u00a0It\u0027s awesome that FB has something in place to protect against that. \u00a0Thanks to their security protection, my account is still safe. \u00a0It\u0027s pretty obvious how this works: Facebook watches where I habitually use my account, either using IP tracking or, more likely, MAC address. \u00a0(The first has to do with your physical location; the second has to do with your physical device.) \u00a0But their entire system is rather opaque, and I can\u0027t control it. \u00a0In addition, if someone really wanted to hijack my account, all they\u0027d have to do is hijack my email first.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EGoogle: 5 Stars\u003C\/h2\u003E\u003Cp\u003EGoogle, by contrast, is spectacular. \u00a0They have something called \u003Ca href=\u0022https:\/\/support.google.com\/accounts\/answer\/185839?hl=en\u0026amp;amp;visit_id=636776640185345619-3242162969\u0026amp;amp;rd=1\u0022\u003E\u003Cstrong\u003Etwo way authentication\u003C\/strong\u003E\u003C\/a\u003E. \u00a0This is industrial-strength security and I\u0027ve only seen it one time before: at the home of an engineer who worked for Sun Microsystems. \u00a0(They may not have had a successful business model, but they sure as hell didn\u0027t get hacked.)\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch3\u003EWhat is 2 Way Authentication?\u003C\/h3\u003E\u003Cp\u003EFor two-way authentication to work, you need a second device. \u00a0In this case, I install an app on my Android phone. \u00a0When I log on to Gmail (or another Google service - \u003Ca href=\u0022https:\/\/about.google\/intl\/en\/products\/\u0022\u003EI use many\u003C\/a\u003E), it asks me for my password, and then it asks me for my secondary code. \u00a0As I write this, my code is \u003Cstrong\u003E422712\u003C\/strong\u003E. \u00a0Don\u0027t bother trying to use it; it changes every 30 seconds. \u00a0(You would also have to hack my password.)\u003C\/p\u003E\u003Cp\u003EIf I lose my laptop, I de-authorize it from my phone. \u00a0If I lose my phone, I de-authorize it from my laptop.\u003C\/p\u003E\u003Cp\u003EThe result is a pretty much bulletproof system. \u00a0\u003Ca href=\u0022https:\/\/xkcd.com\/538\/\u0022\u003EShort of kidnapping me\u003C\/a\u003E, you are never going to hack my Gmail. \u00a0I wish Facebook did this.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EYahoo: 1 Used Piece of Toilet Paper\u003C\/h2\u003E\u003Cp\u003EIf you still have Yahoo mail, chances are you\u0027ve already been hacked. \u00a0I have two accounts which I haven\u0027t used in 15 years, and they both got hacked. \u00a0They both had strong, secure passwords which I wasn\u0027t using elsewhere. \u00a0(We\u0027ll talk about password strength in a minute.) \u00a0There are several typical venues for hacking accounts (wireless sniffing, etc.), and it wasn\u0027t any of these. \u00a0Yahoo\u0027s servers simply aren\u0027t secure. \u00a0The solution is to stop using Yahoo. \u00a0Not only does their mail suck, but Gmail\u0027s security is quantitatively better (see above).\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EWhat You\u0027re Doing Wrong and How To Fix It\u003C\/h2\u003E\u003Cp\u003EBy now you already have half the answer: Trust Facebook and Gmail, don\u0027t trust Yahoo. \u00a0The other half has to do with\u00a0\u003Cstrong\u003Epassword security\u003C\/strong\u003E.\u003C\/p\u003E\u003Cp\u003EIt turns out the conventional wisdom about passwords is wrong. \u00a0First of all, if your account is going to get hacked, it\u0027s more likely because of \u003Ca href=\u0022https:\/\/xkcd.com\/792\/\u0022\u003Epassword reuse\u003C\/a\u003E or weak servers (eg. Yahoo). \u00a0It\u0027s still a good idea to have a strong password, but the classic method of \u0022add a capital letter and punctuation\u0022 is useless.\u003C\/p\u003E\u003Cp\u003EI\u0027m talking, of course, about brute force attacks. \u00a0If someone is going to keep entering random characters in an attempt to guess your password, how long will it take? \u00a0On Facebook or Google, it will never happen (see above). \u00a0But not everything can go through Facebook or Google, so what do you do the rest of the time? \u00a0It has to do with\u00a0\u003Cstrong\u003Eentropy\u003C\/strong\u003E. \u00a0If a computer is randomly guessing characters, then it doesn\u0027t care that you substituted the e for a 3. \u00a0It\u0027s going to guess it sooner or later. \u00a0It\u0027s probably going to \u003Ca href=\u0022https:\/\/gizmodo.com\/the-25-most-popular-passwords-of-2012-5954372\u0022\u003Estart with common guesses\u003C\/a\u003E, like \u0022password\u0022 and \u0022123456.\u0022 \u00a0After that it\u0027s going to throw in random letters and numbers and eventually it\u0027s going to get it right. \u00a0Using a capital letter isn\u0027t going to slow it down much. \u00a0For example, \u0022Tr0ub4dor\u0026amp;3\u0022 isn\u0027t terribly strong; there are only 11 characters to guess.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch3\u003EThe Answer\u003C\/h3\u003E\u003Cp\u003EYour password doesn\u0027t have to be confusing, it just has to be long. \u00a0For example, \u0022correct horse battery staple\u0022. \u00a0It\u0027s plain English, very easy to remember, and provides 28 characters to guess, making it\u003Ci\u003E\u00a0\u003C\/i\u003E\u003Cem\u003E65536 times more secure\u003C\/em\u003E. \u00a0Because of mathematics, the difficulty to guess increases\u00a0\u003Cem\u003Eexponentially\u003C\/em\u003E. \u00a0In other words:\u003C\/p\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/xkcd.com\/936\/\u0022\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20133003113214.png\u0022 \/\u003E\u003C\/a\u003E\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ERight now, you have probably given all your sensitive information to two of three large companies. \u0026nbsp;They are Facebook, Google, and Yahoo. \u0026nbsp;Of the three, Google has the best security. \u0026nbsp;Facebook is okay, and Yahoo is terrible. \u0026nbsp;Let\u0027s see why.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EFacebook: 3 Stars\u003C\/h2\u003E\n\u003Cp\u003EYesterday, Facebook froze my account because someone had tried to hack it from Thailand. \u0026nbsp;It\u0027s awesome that FB has something in place to protect against that. \u0026nbsp;Thanks to their security protection, my account is still safe. \u0026nbsp;It\u0027s pretty obvious how this works: Facebook watches where I habitually use my account, either using IP tracking or, more likely, MAC address. \u0026nbsp;(The first has to do with your physical location; the second has to do with your physical device.) \u0026nbsp;But their entire system is rather opaque, and I can\u0027t control it. \u0026nbsp;In addition, if someone really wanted to hijack my account, all they\u0027d have to do is hijack my email first.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EGoogle: 5 Stars\u003C\/h2\u003E\n\u003Cp\u003EGoogle, by contrast, is spectacular. \u0026nbsp;They have something called \u003Ca href=\u0022https:\/\/support.google.com\/accounts\/answer\/185839?hl=en\u0026amp;amp;visit_id=636776640185345619-3242162969\u0026amp;amp;rd=1\u0022\u003E\u003Cstrong\u003Etwo way authentication\u003C\/strong\u003E\u003C\/a\u003E. \u0026nbsp;This is industrial-strength security and I\u0027ve only seen it one time before: at the home of an engineer who worked for Sun Microsystems. \u0026nbsp;(They may not have had a successful business model, but they sure as hell didn\u0027t get hacked.)\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch3\u003EWhat is 2 Way Authentication?\u003C\/h3\u003E\n\u003Cp\u003EFor two-way authentication to work, you need a second device. \u0026nbsp;In this case, I install an app on my Android phone. \u0026nbsp;When I log on to Gmail (or another Google service - \u003Ca href=\u0022https:\/\/about.google\/intl\/en\/products\/\u0022\u003EI use many\u003C\/a\u003E), it asks me for my password, and then it asks me for my secondary code. \u0026nbsp;As I write this, my code is \u003Cstrong\u003E422712\u003C\/strong\u003E. \u0026nbsp;Don\u0027t bother trying to use it; it changes every 30 seconds. \u0026nbsp;(You would also have to hack my password.)\u003C\/p\u003E\n\u003Cp\u003EIf I lose my laptop, I de-authorize it from my phone. \u0026nbsp;If I lose my phone, I de-authorize it from my laptop.\u003C\/p\u003E\n\u003Cp\u003EThe result is a pretty much bulletproof system. \u0026nbsp;\u003Ca href=\u0022https:\/\/xkcd.com\/538\/\u0022\u003EShort of kidnapping me\u003C\/a\u003E, you are never going to hack my Gmail. \u0026nbsp;I wish Facebook did this.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EYahoo: 1 Used Piece of Toilet Paper\u003C\/h2\u003E\n\u003Cp\u003EIf you still have Yahoo mail, chances are you\u0027ve already been hacked. \u0026nbsp;I have two accounts which I haven\u0027t used in 15 years, and they both got hacked. \u0026nbsp;They both had strong, secure passwords which I wasn\u0027t using elsewhere. \u0026nbsp;(We\u0027ll talk about password strength in a minute.) \u0026nbsp;There are several typical venues for hacking accounts (wireless sniffing, etc.), and it wasn\u0027t any of these. \u0026nbsp;Yahoo\u0027s servers simply aren\u0027t secure. \u0026nbsp;The solution is to stop using Yahoo. \u0026nbsp;Not only does their mail suck, but Gmail\u0027s security is quantitatively better (see above).\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EWhat You\u0027re Doing Wrong and How To Fix It\u003C\/h2\u003E\n\u003Cp\u003EBy now you already have half the answer: Trust Facebook and Gmail, don\u0027t trust Yahoo. \u0026nbsp;The other half has to do with\u0026nbsp;\u003Cstrong\u003Epassword security\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Cp\u003EIt turns out the conventional wisdom about passwords is wrong. \u0026nbsp;First of all, if your account is going to get hacked, it\u0027s more likely because of \u003Ca href=\u0022https:\/\/xkcd.com\/792\/\u0022\u003Epassword reuse\u003C\/a\u003E or weak servers (eg. Yahoo). \u0026nbsp;It\u0027s still a good idea to have a strong password, but the classic method of \u0022add a capital letter and punctuation\u0022 is useless.\u003C\/p\u003E\n\u003Cp\u003EI\u0027m talking, of course, about brute force attacks. \u0026nbsp;If someone is going to keep entering random characters in an attempt to guess your password, how long will it take? \u0026nbsp;On Facebook or Google, it will never happen (see above). \u0026nbsp;But not everything can go through Facebook or Google, so what do you do the rest of the time? \u0026nbsp;It has to do with\u0026nbsp;\u003Cstrong\u003Eentropy\u003C\/strong\u003E. \u0026nbsp;If a computer is randomly guessing characters, then it doesn\u0027t care that you substituted the e for a 3. \u0026nbsp;It\u0027s going to guess it sooner or later. \u0026nbsp;It\u0027s probably going to \u003Ca href=\u0022https:\/\/gizmodo.com\/the-25-most-popular-passwords-of-2012-5954372\u0022\u003Estart with common guesses\u003C\/a\u003E, like \u0022password\u0022 and \u0022123456.\u0022 \u0026nbsp;After that it\u0027s going to throw in random letters and numbers and eventually it\u0027s going to get it right. \u0026nbsp;Using a capital letter isn\u0027t going to slow it down much. \u0026nbsp;For example, \u0022Tr0ub4dor\u0026amp;3\u0022 isn\u0027t terribly strong; there are only 11 characters to guess.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch3\u003EThe Answer\u003C\/h3\u003E\n\u003Cp\u003EYour password doesn\u0027t have to be confusing, it just has to be long. \u0026nbsp;For example, \u0022correct horse battery staple\u0022. \u0026nbsp;It\u0027s plain English, very easy to remember, and provides 28 characters to guess, making it\u003Ci\u003E\u0026nbsp;\u003C\/i\u003E\u003Cem\u003E65536 times more secure\u003C\/em\u003E. \u0026nbsp;Because of mathematics, the difficulty to guess increases\u0026nbsp;\u003Cem\u003Eexponentially\u003C\/em\u003E. \u0026nbsp;In other words:\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/xkcd.com\/936\/\u0022\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20133003113214.png\u0022\u003E\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1440128053,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":23}],"uuid":[{"value":"a7263c7d-8cb5-4e2c-b566-e6d11d0feb75"}],"vid":[{"value":389}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2023-11-09T17:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"What Google Doesn\u0027t Get About Social Networks"}],"created":[{"value":"2013-03-28T05:20:36+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2023-11-09T17:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/what-google-doesnt-get-about-social-networks","pid":56,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve heard a lot of upset people \u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/03\/24\/bees\/\u0022\u003Ecomplaining\u003C\/a\u003E about Google\u0027s decision to \u003Ca href=\u0022http:\/\/googlereader.blogspot.com\/2013\/03\/powering-down-google-reader.html\u0022\u003Eclose down Reader\u003C\/a\u003E. \u00a0I was also upset, because I\u0027ve been a loyal user for some time, and I had to find an alternate feed reader. \u00a0(I settled on \u003Ca href=\u0022https:\/\/feedly.com\/\u0022\u003EFeedly\u003C\/a\u003E, which is excellent.) \u00a0But that\u0027s not why shutting down the service is a mistake.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EI was originally upset because I\u0027m afraid that Google has\u00a0\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=MpraJYnbVtE\u0022\u003Ejumped the shark\u003C\/a\u003E. \u00a0I used to be a very active Yahoo user: mail, address book, calendar, to do lists, documents, even a customized home page. \u00a0I even had a paid account. \u00a0When their service started to go downhill, I switched to Google. \u00a0I fell more and more in love with Google\u0027s wonderfulness and never looked back. \u00a0But in the last year, Google closed down two products I actually used. \u00a0The first is iGoogle, a customized home page that mimicks what I had with Yahoo. \u00a0To be honest I hadn\u0027t used iGoogle in a while, so I understood why they were shutting it off. \u00a0But I use Google Reader several times a day, every day. \u00a0They couldn\u0027t figure out a way to monetize news feeds? \u00a0Really? \u00a0If this is the shape of things to come, I might have to bail on Google the way I bailed on Yahoo. \u00a0Not sure where I\u0027ll go next; Google has a truly tremendous array of services and I use most of them.\u003C\/p\u003E\u003Cp\u003EOne truism about Facebook is\u00a0\u003Cstrong\u003Eif you\u0027re not paying for it, you\u0027re not the customer; you\u0027re the product being sold.\u003C\/strong\u003E \u00a0This is true with Google too. \u00a0I\u0027m fine with that, but the problem is raises is that if I\u0027m not the customer, I can\u0027t complain about the product I receive, any more than a cow can complain that he\u0027s turning into a Happy Meal.\u003C\/p\u003E\u003Cp\u003ESo, why should Google care? \u00a0How was this actually a bad decision for Google? \u00a0The answer: Google Plus.\u003C\/p\u003E\u003Cp\u003EFor years, Google has been trying to defeat Facebook. \u00a0Their attempts have been ham-handed at best. \u00a0Never mind the fact that competing with Facebook is like trying to compete against VHS; it\u0027s yesterday\u0027s news. \u00a0Facebook was brilliant because it was relatively\u00a0\u003Cem\u003Enew\u003C\/em\u003E; social networks are now\u00a0\u003Cem\u003Efifteen years old\u003C\/em\u003E. \u00a0What\u0027s the\u00a0\u003Cem\u003Enext\u003C\/em\u003E big thing that\u0027s going to reshape the internet? \u00a0Why isn\u0027t Google trying to look for that? \u00a0It\u0027s like competing for the land speed record when you should be building a spaceship. \u00a0Google got where it is today by being creative and thinking outside the box. \u00a0Now they\u0027re turning into a lumbering behemoth reminiscient of Microsoft.\u003C\/p\u003E\u003Cp\u003EWhy has Googel failed to beat Facebook? \u00a0Partly because they weren\u0027t able to offer something that was actually better. \u00a0Multi-way video chat with Google Hangouts is awesome, and the feature gets a lot of use, but\u00a0\u003Cem\u003Ethat\u0027s not a social network.\u003C\/em\u003E \u00a0Another reason Google failed was because social networks need to be\u00a0\u003Cem\u003Eorganic\u003C\/em\u003E. \u00a0Starting on college campuses was one of the most brilliant moves Facebook could have ever made. \u00a0It supplanted Friendster and MySpace because it was better, but also because it offered a built-in organicness that the other networks lacked. \u00a0I was a freshman in undergrad when Facebook came to my college. \u00a0I was the target demographic. \u00a0I had waited for months in rapt anticipation while the phrase \u0022girls on Facebook are hotter\u0022 slowly became a meme. \u00a0By the time I was allowed in, I was\u00a0\u003Cem\u003Ethrilled\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut the real tragedy here - for Google - is this:\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003EThey had a social network the entire time.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIn fact, they had\u00a0\u003Cem\u003Eseveral\u003C\/em\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESee, Google Reader is a social network. \u00a0I first started using it because \u003Ca href=\u0022https:\/\/twitter.com\/curtischambers\u0022\u003Ea friend of mine \u003C\/a\u003Eused it. \u00a0Not only did he use it, but he shared articles he found interesting. \u00a0This \u0022share feed\u0022 was its own thing, and I subscribed to that. \u00a0My friend shared some neat stuff.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ETHAT\u0027S IT, GOOGLE. \u00a0THAT\u0027S WHAT YOU\u0027RE TRYING TO DO. \u00a0THAT IS A SOCIAL NETWORK. \u00a0RIGHT THERE.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI don\u0027t think I can shout loud enough for them to hear me now. \u00a0Pity.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe good news: They have another social network and they haven\u0027t borked it yet. \u00a0I\u0027m talking, of course, about Youtube. \u00a0On Youtube, you have your own account. \u00a0You even have your own \u0022channel,\u0022 a landing page people can visit. \u00a0You can customize your channel with information, individual videos, and even lists. \u00a0People can \u0022subscribe\u0022 to you and get automatic notifications when you post something new. \u00a0They can share your videos on their own channels. \u00a0They can leave comments, and rate other people\u0027s comments. \u00a0They can even post video replies. \u00a0Not to mention integration with outside social networks like Facebook and Twitter. \u00a0Those two services can\u0027t manage to talk to each other, but Youtube talks to both.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EGoogle\u0027s third social network is Blogger. \u00a0It\u0027s the simplest, easiest, most elegant way to blog on the web (for people who still do \u0022long form\u0022). \u00a0Not only does your blogger account generate its own feed (which you can subscribe to using Reader - oops!), but it has its own interface so you can follow all your friends who are also on blogger. \u00a0You can use your blogger account to leave comments on your friends\u0027 posts or sign their \u0022guest book.\u0022 \u00a0(Don\u0027t have a Blogger account? \u00a0That\u0027s okay, just use your gmail address! \u00a0Turns out you already have a Google account!) \u00a0Each blog shows a list of people who \u0022follow\u0022 that blog, and you can click on each one to check out\u00a0\u003Cem\u003Etheir\u00a0\u003C\/em\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Eblog.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EPicassa does the same thing, but with photos. \u00a0You see where this is going.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ELet\u0027s say, instead of Plus, Google had chosen to wrap their existing services together. \u00a0You\u0027d have a platform that would let you post text, video, photos, or external links. \u00a0Your friends could comment on your posts. \u00a0Add in gchat and you\u0027re talking to your friends in real time - via instant message, voice, or even video. \u00a0You\u0027d have an activity feed that other people could follow. \u00a0\u003Cem\u003ESound familiar?\u003C\/em\u003E \u00a0It\u0027s just like Facebook, but actually better. \u00a0Facebook doesn\u0027t support long-form blogging, its video support is pitiful, and Facebook chat doesn\u0027t support voice or video.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBest of all, this mythical Google network would include tens of millions of existing users, who have been using these services to connect with each other all along. \u00a0It would be active and it would be real.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EInstead, Google tried to invent the wheel and fell on its face. \u00a0And now it\u0027s axing the services that people actually use.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis belies a lack of understanding of what makes a social network succeed. \u00a0It also shows that Google doesn\u0027t really understand what it already has. \u00a0To some extent, \u003Ca href=\u0022https:\/\/xkcd.com\/792\/\u0022\u003Ethat\u0027s probably a good thing\u003C\/a\u003E.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut that doesn\u0027t make me happy about it.\u003C\/span\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve heard a lot of upset people \u003Ca href=\u0022https:\/\/techcrunch.com\/2013\/03\/24\/bees\/\u0022\u003Ecomplaining\u003C\/a\u003E about Google\u0027s decision to \u003Ca href=\u0022http:\/\/googlereader.blogspot.com\/2013\/03\/powering-down-google-reader.html\u0022\u003Eclose down Reader\u003C\/a\u003E. \u0026nbsp;I was also upset, because I\u0027ve been a loyal user for some time, and I had to find an alternate feed reader. \u0026nbsp;(I settled on \u003Ca href=\u0022https:\/\/feedly.com\/\u0022\u003EFeedly\u003C\/a\u003E, which is excellent.) \u0026nbsp;But that\u0027s not why shutting down the service is a mistake.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EI was originally upset because I\u0027m afraid that Google has\u0026nbsp;\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=MpraJYnbVtE\u0022\u003Ejumped the shark\u003C\/a\u003E. \u0026nbsp;I used to be a very active Yahoo user: mail, address book, calendar, to do lists, documents, even a customized home page. \u0026nbsp;I even had a paid account. \u0026nbsp;When their service started to go downhill, I switched to Google. \u0026nbsp;I fell more and more in love with Google\u0027s wonderfulness and never looked back. \u0026nbsp;But in the last year, Google closed down two products I actually used. \u0026nbsp;The first is iGoogle, a customized home page that mimicks what I had with Yahoo. \u0026nbsp;To be honest I hadn\u0027t used iGoogle in a while, so I understood why they were shutting it off. \u0026nbsp;But I use Google Reader several times a day, every day. \u0026nbsp;They couldn\u0027t figure out a way to monetize news feeds? \u0026nbsp;Really? \u0026nbsp;If this is the shape of things to come, I might have to bail on Google the way I bailed on Yahoo. \u0026nbsp;Not sure where I\u0027ll go next; Google has a truly tremendous array of services and I use most of them.\u003C\/p\u003E\n\u003Cp\u003EOne truism about Facebook is\u0026nbsp;\u003Cstrong\u003Eif you\u0027re not paying for it, you\u0027re not the customer; you\u0027re the product being sold.\u003C\/strong\u003E \u0026nbsp;This is true with Google too. \u0026nbsp;I\u0027m fine with that, but the problem is raises is that if I\u0027m not the customer, I can\u0027t complain about the product I receive, any more than a cow can complain that he\u0027s turning into a Happy Meal.\u003C\/p\u003E\n\u003Cp\u003ESo, why should Google care? \u0026nbsp;How was this actually a bad decision for Google? \u0026nbsp;The answer: Google Plus.\u003C\/p\u003E\n\u003Cp\u003EFor years, Google has been trying to defeat Facebook. \u0026nbsp;Their attempts have been ham-handed at best. \u0026nbsp;Never mind the fact that competing with Facebook is like trying to compete against VHS; it\u0027s yesterday\u0027s news. \u0026nbsp;Facebook was brilliant because it was relatively\u0026nbsp;\u003Cem\u003Enew\u003C\/em\u003E; social networks are now\u0026nbsp;\u003Cem\u003Efifteen years old\u003C\/em\u003E. \u0026nbsp;What\u0027s the\u0026nbsp;\u003Cem\u003Enext\u003C\/em\u003E big thing that\u0027s going to reshape the internet? \u0026nbsp;Why isn\u0027t Google trying to look for that? \u0026nbsp;It\u0027s like competing for the land speed record when you should be building a spaceship. \u0026nbsp;Google got where it is today by being creative and thinking outside the box. \u0026nbsp;Now they\u0027re turning into a lumbering behemoth reminiscient of Microsoft.\u003C\/p\u003E\n\u003Cp\u003EWhy has Googel failed to beat Facebook? \u0026nbsp;Partly because they weren\u0027t able to offer something that was actually better. \u0026nbsp;Multi-way video chat with Google Hangouts is awesome, and the feature gets a lot of use, but\u0026nbsp;\u003Cem\u003Ethat\u0027s not a social network.\u003C\/em\u003E \u0026nbsp;Another reason Google failed was because social networks need to be\u0026nbsp;\u003Cem\u003Eorganic\u003C\/em\u003E. \u0026nbsp;Starting on college campuses was one of the most brilliant moves Facebook could have ever made. \u0026nbsp;It supplanted Friendster and MySpace because it was better, but also because it offered a built-in organicness that the other networks lacked. \u0026nbsp;I was a freshman in undergrad when Facebook came to my college. \u0026nbsp;I was the target demographic. \u0026nbsp;I had waited for months in rapt anticipation while the phrase \u0022girls on Facebook are hotter\u0022 slowly became a meme. \u0026nbsp;By the time I was allowed in, I was\u0026nbsp;\u003Cem\u003Ethrilled\u003C\/em\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut the real tragedy here - for Google - is this:\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E\u003Cstrong\u003EThey had a social network the entire time.\u003C\/strong\u003E\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EIn fact, they had\u0026nbsp;\u003Cem\u003Eseveral\u003C\/em\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESee, Google Reader is a social network. \u0026nbsp;I first started using it because \u003Ca href=\u0022https:\/\/twitter.com\/curtischambers\u0022\u003Ea friend of mine \u003C\/a\u003Eused it. \u0026nbsp;Not only did he use it, but he shared articles he found interesting. \u0026nbsp;This \u0022share feed\u0022 was its own thing, and I subscribed to that. \u0026nbsp;My friend shared some neat stuff.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ETHAT\u0027S IT, GOOGLE. \u0026nbsp;THAT\u0027S WHAT YOU\u0027RE TRYING TO DO. \u0026nbsp;THAT IS A SOCIAL NETWORK. \u0026nbsp;RIGHT THERE.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI don\u0027t think I can shout loud enough for them to hear me now. \u0026nbsp;Pity.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThe good news: They have another social network and they haven\u0027t borked it yet. \u0026nbsp;I\u0027m talking, of course, about Youtube. \u0026nbsp;On Youtube, you have your own account. \u0026nbsp;You even have your own \u0022channel,\u0022 a landing page people can visit. \u0026nbsp;You can customize your channel with information, individual videos, and even lists. \u0026nbsp;People can \u0022subscribe\u0022 to you and get automatic notifications when you post something new. \u0026nbsp;They can share your videos on their own channels. \u0026nbsp;They can leave comments, and rate other people\u0027s comments. \u0026nbsp;They can even post video replies. \u0026nbsp;Not to mention integration with outside social networks like Facebook and Twitter. \u0026nbsp;Those two services can\u0027t manage to talk to each other, but Youtube talks to both.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EGoogle\u0027s third social network is Blogger. \u0026nbsp;It\u0027s the simplest, easiest, most elegant way to blog on the web (for people who still do \u0022long form\u0022). \u0026nbsp;Not only does your blogger account generate its own feed (which you can subscribe to using Reader - oops!), but it has its own interface so you can follow all your friends who are also on blogger. \u0026nbsp;You can use your blogger account to leave comments on your friends\u0027 posts or sign their \u0022guest book.\u0022 \u0026nbsp;(Don\u0027t have a Blogger account? \u0026nbsp;That\u0027s okay, just use your gmail address! \u0026nbsp;Turns out you already have a Google account!) \u0026nbsp;Each blog shows a list of people who \u0022follow\u0022 that blog, and you can click on each one to check out\u0026nbsp;\u003Cem\u003Etheir\u0026nbsp;\u003C\/em\u003E\u003C\/span\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003Eblog.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EPicassa does the same thing, but with photos. \u0026nbsp;You see where this is going.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ELet\u0027s say, instead of Plus, Google had chosen to wrap their existing services together. \u0026nbsp;You\u0027d have a platform that would let you post text, video, photos, or external links. \u0026nbsp;Your friends could comment on your posts. \u0026nbsp;Add in gchat and you\u0027re talking to your friends in real time - via instant message, voice, or even video. \u0026nbsp;You\u0027d have an activity feed that other people could follow. \u0026nbsp;\u003Cem\u003ESound familiar?\u003C\/em\u003E \u0026nbsp;It\u0027s just like Facebook, but actually better. \u0026nbsp;Facebook doesn\u0027t support long-form blogging, its video support is pitiful, and Facebook chat doesn\u0027t support voice or video.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBest of all, this mythical Google network would include tens of millions of existing users, who have been using these services to connect with each other all along. \u0026nbsp;It would be active and it would be real.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EInstead, Google tried to invent the wheel and fell on its face. \u0026nbsp;And now it\u0027s axing the services that people actually use.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EThis belies a lack of understanding of what makes a social network succeed. \u0026nbsp;It also shows that Google doesn\u0027t really understand what it already has. \u0026nbsp;To some extent, \u003Ca href=\u0022https:\/\/xkcd.com\/792\/\u0022\u003Ethat\u0027s probably a good thing\u003C\/a\u003E.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EBut that doesn\u0027t make me happy about it.\u003C\/span\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1364448036,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":22}],"uuid":[{"value":"1675db00-4634-466c-8cf7-83fad63a7e99"}],"vid":[{"value":115}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Three Videos About Fonts"}],"created":[{"value":"2013-02-17T06:06:41+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/three-videos-about-fonts","pid":55,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EYou might be aware that \u003Ca href=\u0022\/content\/webfonts-next-generation\u0022\u003Eweb fonts are a big deal for me\u003C\/a\u003E. \u00a0So I was pleased to come across a couple excellent videos that talk about webfonts today. \u00a0The first is cute and fun: how different fonts would sound if they could speak.\u003C\/p\u003E\u003Cp\u003E[video:http:\/\/www.youtube.com\/watch?v=pmpQiJ4wCw4]\u003C\/p\u003E\u003Cp\u003ENext up: A more serious discussion of the different kinds of fonts and why it matters. \u00a0Hint: It has to do with the impact of your writing.\u003C\/p\u003E\u003Cp\u003E\u003Ciframe allowtransparency=\u0022true\u0022 class=\u0022wistia_embed\u0022 frameborder=\u00220\u0022 height=\u0022295\u0022 name=\u0022wistia_embed\u0022 scrolling=\u0022no\u0022 src=\u0022http:\/\/fast.wistia.net\/embed\/iframe\/y1cotzvl8g?controlsVisibleOnLoad=true\u0026amp;endVideoBehavior=reset\u0026amp;playerColor=108ed7\u0026amp;plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=embed\u0026amp;plugin%5Bsocialbar-v1%5D%5BtweetText%5D=\u0026amp;version=v1\u0026amp;videoHeight=360\u0026amp;videoWidth=640\u0026amp;volumeControl=true\u0026amp;canonicalUrl=http%3A%2F%2Fblog.asana.com%2F2013%2F02%2Flets-talk-about-fonts-video%2F%3Futm_source%3Drss%26utm_medium%3Drss%26utm_campaign%3Dlets-talk-about-fonts-video\u0026amp;canonicalTitle=typography.video.edit.m4v\u0022 width=\u0022480\u0022 id=\u0022wistia_embed\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\u003Cp\u003EFinally, an old classic. \u00a0The above video shows a clip of a music video on Youtube that makes heavy use of different fonts for emotional effect. \u00a0Here\u0027s the same thing, but infinitely better:\u003C\/p\u003E\u003Cp\u003E[video:http:\/\/www.youtube.com\/watch?v=3IJ6b3E5HYE]\u003C\/p\u003E\u003Cp\u003EIt turns out that turning movie scenes into typography is actually pretty popular; more examples include \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=n9WeNXlA3Ek\u0022\u003EFull Metal Jacket\u003C\/a\u003E and\u00a0\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=XdSBZ5WtSJc\u0022\u003EInglorious Basterds\u003C\/a\u003E. \u00a0Note how they use size, orientation, and the occasional color and alternate typeface to show emphasis. \u00a0\u003Cem\u003EThis is exactly what I\u0027m talking about.\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EYou might be aware that \u003Ca href=\u0022\/content\/webfonts-next-generation\u0022\u003Eweb fonts are a big deal for me\u003C\/a\u003E. \u0026nbsp;So I was pleased to come across a couple excellent videos that talk about webfonts today. \u0026nbsp;The first is cute and fun: how different fonts would sound if they could speak.\u003C\/p\u003E\n\u003Cp\u003E[video:\u003Ca href=\u0022http:\/\/www.youtube.com\/watch?v=pmpQiJ4wCw4\u0022\u003Ehttp:\/\/www.youtube.com\/watch?v=pmpQiJ4wCw4\u003C\/a\u003E]\u003C\/p\u003E\n\u003Cp\u003ENext up: A more serious discussion of the different kinds of fonts and why it matters. \u0026nbsp;Hint: It has to do with the impact of your writing.\u003C\/p\u003E\n\u003Cp\u003E\u003Ciframe allowtransparency=\u0022true\u0022 class=\u0022wistia_embed\u0022 frameborder=\u00220\u0022 height=\u0022295\u0022 name=\u0022wistia_embed\u0022 scrolling=\u0022no\u0022 src=\u0022http:\/\/fast.wistia.net\/embed\/iframe\/y1cotzvl8g?controlsVisibleOnLoad=true\u0026amp;endVideoBehavior=reset\u0026amp;playerColor=108ed7\u0026amp;plugin%5Bsocialbar-v1%5D%5Bbuttons%5D=embed\u0026amp;plugin%5Bsocialbar-v1%5D%5BtweetText%5D=\u0026amp;version=v1\u0026amp;videoHeight=360\u0026amp;videoWidth=640\u0026amp;volumeControl=true\u0026amp;canonicalUrl=http%3A%2F%2Fblog.asana.com%2F2013%2F02%2Flets-talk-about-fonts-video%2F%3Futm_source%3Drss%26utm_medium%3Drss%26utm_campaign%3Dlets-talk-about-fonts-video\u0026amp;canonicalTitle=typography.video.edit.m4v\u0022 width=\u0022480\u0022 id=\u0022wistia_embed\u0022\u003E\u003C\/iframe\u003E\u003C\/p\u003E\n\u003Cp\u003EFinally, an old classic. \u0026nbsp;The above video shows a clip of a music video on Youtube that makes heavy use of different fonts for emotional effect. \u0026nbsp;Here\u0027s the same thing, but infinitely better:\u003C\/p\u003E\n\u003Cp\u003E[video:\u003Ca href=\u0022http:\/\/www.youtube.com\/watch?v=3IJ6b3E5HYE\u0022\u003Ehttp:\/\/www.youtube.com\/watch?v=3IJ6b3E5HYE\u003C\/a\u003E]\u003C\/p\u003E\n\u003Cp\u003EIt turns out that turning movie scenes into typography is actually pretty popular; more examples include \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=n9WeNXlA3Ek\u0022\u003EFull Metal Jacket\u003C\/a\u003E and\u0026nbsp;\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=XdSBZ5WtSJc\u0022\u003EInglorious Basterds\u003C\/a\u003E. \u0026nbsp;Note how they use size, orientation, and the occasional color and alternate typeface to show emphasis. \u0026nbsp;\u003Cem\u003EThis is exactly what I\u0027m talking about.\u003C\/em\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1361081201,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":21}],"uuid":[{"value":"85cce6be-9449-4447-915e-a2c0cfd117a1"}],"vid":[{"value":391}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2024-03-28T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Webfonts: The Next Generation"}],"created":[{"value":"2013-02-03T07:26:00+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-03-28T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/webfonts-next-generation","pid":54,"langcode":"und"}],"body":[{"value":"\u003Cp\u003E\u003Cstrong\u003EEdit:\u003C\/strong\u003E\u00a0\u003Cem\u003EI was all excited about this awesome new way of doing advanced typography online. \u00a0Turns out it doesn\u0027t work. \u00a0:-(\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003EHere\u0027s the problem: computers are primitive. \u00a0Software is an endless struggle of trying to do amazing things with hardware that can\u0027t really support it. \u00a0Go to a library some time and take a look at the books on the shelves. \u00a0Never mind reading anything, although that\u0027s a more rewarding experience too. \u00a0Simply gaze at the covers, the spines. \u00a0Open one up and look at the ink upon the paper. \u00a0The beautiful fonts, the perfectly proportioned kerning, spacing, and margins. \u00a0Walk outside and look up at bilboards and advertisements. \u00a0Open a magazine or newspaper and gaze upon the pageant of typography.\u003C\/p\u003E\u003Cp\u003ENow visit a website and weep.\u003C\/p\u003E\u003Cp\u003EUntil recently, none of those things were possible on a web page. \u00a0There are lots of ways in which web design is slowly catching up to print media. \u00a0We\u0027ve got colors and structure. \u00a0We can even do fancy things like rich media (sound, videos, maps). \u00a0But typography is one very important way in which web design has seriously lagged behind print media. \u00a0Font selection has been an important aspect of print for 500 years; modern designers are still influenced heavily by the works of 16th-century designer \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Claude_Garamond\u0022\u003EClaude Garamond\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EIf you\u0027ve ever heard me speak, you probably already know how excited I am about webfonts. \u00a0It\u0027s not just a way of making websites prettier. \u00a0It\u0027s the single most important way in which web design still lags behind print media. \u00a0Even the current standard of web fonts is lacking. \u00a0You can render a font, and even support variants for bold and italics, but all you get are the basic letters. \u00a0Advanced typography, such as ligatures, flares, and fractions, are impossible.\u003C\/p\u003E\u003Cp\u003EUntil now?\u003C\/p\u003E\u003Cp\u003EFonts.com recently upgraded their technology to support advanced OpenType features, including ligatures, old style numbers, and fractions. \u00a0Does it work? \u00a0Sadly, no.\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI\u0027ve switched fonts on Koplowicz \u0026amp; Sons, for the third time now. \u00a0My first choice was \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/monticello\/roman\/web-font\u0022 style=\u0022line-height: 1.538em;\u0022\u003EMonticello\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, which has an amazing history - including \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.monticello.org\/research-education\/thomas-jefferson-encyclopedia\/monticello-typeface\/\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ea deep connection to Thomas Jefferson\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E. \u00a0The version I used was a modern revival by \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.myfonts.com\/collections\/matthew-carter\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ethe same guy who did Georgia and Verdana\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E. \u00a0I hit some technical difficulties with Fonts.com, and in the mean time I used \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/frutiger-serif\/regular\/web-font\u0022 style=\u0022line-height: 1.538em;\u0022\u003EFrutiger Serif\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, a modern typeface designed by one of the greatest font designers of the 20th Century.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003EEven with OpenType support, finding a good webfont still presents challenges. \u00a0Not all fonts have OpenType support. \u00a0In other words, type designers are sometimes lazy and not every font comes with full variants for bold, italic, ligatures, etc. \u00a0I was going to use \u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/sabon-next\/regular\/web-font\u0022\u003ESabon Next\u003C\/a\u003E, a phenomenal modern font from Adobe. \u00a0They\u0027ve even released multiple renderings for different sizes, so your font will look great whether it\u0027s a giant header or tiny caption. \u00a0And it has full OpenType support. \u00a0Unfortunately, \u003Cem\u003Eits italic and bold variants don\u0027t\u003C\/em\u003E. \u00a0I finally landed on\u00a0\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/janson-text\u0022\u003EJanson Text\u003C\/a\u003E, a font with a delicious history, and full OT support in bold and italic. \u00a0Sadly, it didn\u0027t work. \u00a0Instead, it crashed my entire website. \u00a0I could spend hours troubleshooting it. \u00a0I could also email Fonts.com tech support, although last time I did that I literally waited weeks for a reply. \u00a0At some point I\u0027ll take another stab at this, but right now I have paid clients that are waiting for me to do useful things.\u003C\/p\u003E\u003Cp\u003EWhy is all this important? \u00a0Because I yearn for the day where there is no functional difference between what you can do on a piece of paper, and what you can do on a web page. \u00a0Today I thought for a moment that maybe we were getting close.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003E\u003Cstrong\u003EEdit:\u003C\/strong\u003E\u0026nbsp;\u003Cem\u003EI was all excited about this awesome new way of doing advanced typography online. \u0026nbsp;Turns out it doesn\u0027t work. \u0026nbsp;:-(\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s the problem: computers are primitive. \u0026nbsp;Software is an endless struggle of trying to do amazing things with hardware that can\u0027t really support it. \u0026nbsp;Go to a library some time and take a look at the books on the shelves. \u0026nbsp;Never mind reading anything, although that\u0027s a more rewarding experience too. \u0026nbsp;Simply gaze at the covers, the spines. \u0026nbsp;Open one up and look at the ink upon the paper. \u0026nbsp;The beautiful fonts, the perfectly proportioned kerning, spacing, and margins. \u0026nbsp;Walk outside and look up at bilboards and advertisements. \u0026nbsp;Open a magazine or newspaper and gaze upon the pageant of typography.\u003C\/p\u003E\n\u003Cp\u003ENow visit a website and weep.\u003C\/p\u003E\n\u003Cp\u003EUntil recently, none of those things were possible on a web page. \u0026nbsp;There are lots of ways in which web design is slowly catching up to print media. \u0026nbsp;We\u0027ve got colors and structure. \u0026nbsp;We can even do fancy things like rich media (sound, videos, maps). \u0026nbsp;But typography is one very important way in which web design has seriously lagged behind print media. \u0026nbsp;Font selection has been an important aspect of print for 500 years; modern designers are still influenced heavily by the works of 16th-century designer \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Claude_Garamond\u0022\u003EClaude Garamond\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EIf you\u0027ve ever heard me speak, you probably already know how excited I am about webfonts. \u0026nbsp;It\u0027s not just a way of making websites prettier. \u0026nbsp;It\u0027s the single most important way in which web design still lags behind print media. \u0026nbsp;Even the current standard of web fonts is lacking. \u0026nbsp;You can render a font, and even support variants for bold and italics, but all you get are the basic letters. \u0026nbsp;Advanced typography, such as ligatures, flares, and fractions, are impossible.\u003C\/p\u003E\n\u003Cp\u003EUntil now?\u003C\/p\u003E\n\u003Cp\u003EFonts.com recently upgraded their technology to support advanced OpenType features, including ligatures, old style numbers, and fractions. \u0026nbsp;Does it work? \u0026nbsp;Sadly, no.\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003EI\u0027ve switched fonts on Koplowicz \u0026amp; Sons, for the third time now. \u0026nbsp;My first choice was \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/monticello\/roman\/web-font\u0022 style=\u0022line-height: 1.538em;\u0022\u003EMonticello\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, which has an amazing history - including \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.monticello.org\/research-education\/thomas-jefferson-encyclopedia\/monticello-typeface\/\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ea deep connection to Thomas Jefferson\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E. \u0026nbsp;The version I used was a modern revival by \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.myfonts.com\/collections\/matthew-carter\u0022 style=\u0022line-height: 1.538em;\u0022\u003Ethe same guy who did Georgia and Verdana\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E. \u0026nbsp;I hit some technical difficulties with Fonts.com, and in the mean time I used \u003C\/span\u003E\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/frutiger-serif\/regular\/web-font\u0022 style=\u0022line-height: 1.538em;\u0022\u003EFrutiger Serif\u003C\/a\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003E, a modern typeface designed by one of the greatest font designers of the 20th Century.\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp\u003EEven with OpenType support, finding a good webfont still presents challenges. \u0026nbsp;Not all fonts have OpenType support. \u0026nbsp;In other words, type designers are sometimes lazy and not every font comes with full variants for bold, italic, ligatures, etc. \u0026nbsp;I was going to use \u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/sabon-next\/regular\/web-font\u0022\u003ESabon Next\u003C\/a\u003E, a phenomenal modern font from Adobe. \u0026nbsp;They\u0027ve even released multiple renderings for different sizes, so your font will look great whether it\u0027s a giant header or tiny caption. \u0026nbsp;And it has full OpenType support. \u0026nbsp;Unfortunately, \u003Cem\u003Eits italic and bold variants don\u0027t\u003C\/em\u003E. \u0026nbsp;I finally landed on\u0026nbsp;\u003Ca href=\u0022https:\/\/www.fonts.com\/font\/linotype\/janson-text\u0022\u003EJanson Text\u003C\/a\u003E, a font with a delicious history, and full OT support in bold and italic. \u0026nbsp;Sadly, it didn\u0027t work. \u0026nbsp;Instead, it crashed my entire website. \u0026nbsp;I could spend hours troubleshooting it. \u0026nbsp;I could also email Fonts.com tech support, although last time I did that I literally waited weeks for a reply. \u0026nbsp;At some point I\u0027ll take another stab at this, but right now I have paid clients that are waiting for me to do useful things.\u003C\/p\u003E\n\u003Cp\u003EWhy is all this important? \u0026nbsp;Because I yearn for the day where there is no functional difference between what you can do on a piece of paper, and what you can do on a web page. \u0026nbsp;Today I thought for a moment that maybe we were getting close.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1359882059,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":20}],"uuid":[{"value":"78466337-8947-4862-b7c9-6d8425f70c00"}],"vid":[{"value":333}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-04-30T05:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Panels vs. Blocks"}],"created":[{"value":"2013-01-24T20:47:42+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-04-30T05:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/panels-vs-blocks","pid":53,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis argument keeps coming up: whether to use Panels or Blocks for laying out your content on a Drupal site. \u00a0Usually there is more than one right way to do things on Drupal, and this is no exception. \u00a0There are pros and cons, of course, but generally it seems to be more an issue of personal preference.\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003EBackground\u003C\/strong\u003E\u003C\/em\u003E: both Panels and Blocks help you arrange areas of content on a web page. \u00a0Blocks is a built in feature and Panels is a community-contributed module. \u00a0Panels is much fancier, so the assumption has always been that it would be slower (because it takes more computing resources).\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EPerformance\u003C\/h2\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/markferree.com\/\u0022\u003EMark Ferree\u003C\/a\u003E recently pointed me in the direction of blog post from a couple months ago that does \u003Ca href=\u0022https:\/\/www.codeenigma.com\/faq\u0022\u003Eactual benchmarking of Panels vs. Blocks\u003C\/a\u003E. \u00a0The result: Panels is faster if you have decent hardware. \u00a0Much faster if you turning on caching.\u003C\/p\u003E\u003Cp\u003EThat, of course, touches on the bigger picture: there are lots of ways of improving Drupal performance. \u00a0If you\u0027re that concerned about performance, you should be using some combination of \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/boost\u0022\u003EBoost\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/varnish\u0022\u003EVarnish\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apc\u0022\u003EAPC\u003C\/a\u003E, a real CDN (like \u003Ca href=\u0022https:\/\/aws.amazon.com\/cloudfront\/\u0022\u003ECloudfront\u003C\/a\u003E), and a more powerful web host (like \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E). \u00a0A performant site on Pantheon will\u00a0\u003Cem\u003Ealways\u003C\/em\u003E perform better than a site running off a four year old laptop.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EWorkflow\u003C\/h2\u003E\u003Cp\u003EI\u0027ve got another reason why I prefer Panels: it has a much better workflow. \u00a0Here\u0027s a comparison of what it takes to achieve the same results with Blocks and Panels:\u003C\/p\u003E\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003ECreate theme template with regions\u003C\/p\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cp\u003EUpdate theme.info file\u003C\/p\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cp\u003ECreate multiple templates for multiple content types\u003C\/p\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003ECreate a Panels Page\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003C\/tbody\u003E\u003C\/table\u003E\u003Cp\u003EIf you want different layouts in different parts of the site (eg. different content types), it gets worse:\u003C\/p\u003E\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003EContext, Display Suite, or multiple duplicate blocks with different visibility rules\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003ECreate a variant\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003C\/tbody\u003E\u003C\/table\u003E\u003Cp\u003EHeaven help you if you want to switch themes at any point. \u00a0Add in nifty features like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panelizer\u0022\u003EPanelizer\u003C\/a\u003E or the In-Place Editor, and Panels is not just easier, but more powerful too. \u00a0Here\u0027s a full rundown of the pros and cons:\u003C\/p\u003E\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u00a0\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EPros\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003EEasier to do responsive theming\u003C\/li\u003E\u003Cli\u003EBuilt in\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003EMore powerful\u003C\/li\u003E\u003Cli\u003EMore performant\u003C\/li\u003E\u003Cli\u003ETheme-independent\u003C\/li\u003E\u003Cli\u003EEasier to use\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003ECons\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003ELayout tied to individual themes\u003C\/li\u003E\u003Cli\u003ERequires handmade theme templates\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003ENot as friendly to responsive design\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003C\/tbody\u003E\u003C\/table\u003E\u003Cp\u003EThere are exceptions, of course. \u00a0\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E is 100% panels-based and has some excellent responsive layouts. \u00a0But those were custom made for the project.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EThe Pudding\u003C\/h2\u003E\u003Cp\u003E. . . is where the proof is. \u00a0So they say. \u00a0On this site, I use both. \u00a0The general layout is done with blocks. \u00a0This is a completely custom theme made with \u003Ca href=\u0022https:\/\/sass-lang.com\/\u0022\u003ESASS\u003C\/a\u003E, so it was actually quite easy to create layout; I didn\u0027t need to customize the templates at all. \u00a0(I did anyway, but for other reasons.) \u00a0My \u003Ca href=\u0022\/portfolio\u0022\u003Eportfolio\u003C\/a\u003E, on the other hand, is a series of panels pages: one for the overview and a panelized page for each site in my gallery. \u00a0So, what\u0027s the rule here?\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EIt Depends\u003C\/h2\u003E\u003Cp\u003EI hate saying that, but it\u0027s true. \u00a0You can use Blocks 100% of the time or Panels 100% of the time, but you will find that one technique is better suited to one task and one technique is better suited to others. \u00a0Here are some general rules which might help:\u003C\/p\u003E\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003E\u00a0\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003Ctr\u003E\u003Ctd\u003EWhen It\u0027s Better\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003EYou\u0027re building a custom theme anyway\u003C\/li\u003E\u003Cli\u003EYou don\u0027t mind your layout being theme-specific\u003C\/li\u003E\u003Cli\u003EResponsive design\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003Ctd\u003E\u003Cul\u003E\u003Cli\u003ESpecific layout requirements for specific pages \/ areas \/ content types\u003C\/li\u003E\u003Cli\u003EYou\u0027re not creating a custom theme\u003C\/li\u003E\u003Cli\u003EWant your layout to be theme-independent\u003C\/li\u003E\u003C\/ul\u003E\u003C\/td\u003E\u003C\/tr\u003E\u003C\/tbody\u003E\u003C\/table\u003E\u003Cp\u003EBottom line: I still prefer Panels, generally speaking. \u00a0It\u0027s newer, fancier, more powerful, easier, and more compatible. \u00a0But I\u0027m not going to be religious about it; sometimes Blocks is a better fit.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThis argument keeps coming up: whether to use Panels or Blocks for laying out your content on a Drupal site. \u0026nbsp;Usually there is more than one right way to do things on Drupal, and this is no exception. \u0026nbsp;There are pros and cons, of course, but generally it seems to be more an issue of personal preference.\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003EBackground\u003C\/strong\u003E\u003C\/em\u003E: both Panels and Blocks help you arrange areas of content on a web page. \u0026nbsp;Blocks is a built in feature and Panels is a community-contributed module. \u0026nbsp;Panels is much fancier, so the assumption has always been that it would be slower (because it takes more computing resources).\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EPerformance\u003C\/h2\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/markferree.com\/\u0022\u003EMark Ferree\u003C\/a\u003E recently pointed me in the direction of blog post from a couple months ago that does \u003Ca href=\u0022https:\/\/www.codeenigma.com\/faq\u0022\u003Eactual benchmarking of Panels vs. Blocks\u003C\/a\u003E. \u0026nbsp;The result: Panels is faster if you have decent hardware. \u0026nbsp;Much faster if you turning on caching.\u003C\/p\u003E\n\u003Cp\u003EThat, of course, touches on the bigger picture: there are lots of ways of improving Drupal performance. \u0026nbsp;If you\u0027re that concerned about performance, you should be using some combination of \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/boost\u0022\u003EBoost\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/varnish\u0022\u003EVarnish\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/apc\u0022\u003EAPC\u003C\/a\u003E, a real CDN (like \u003Ca href=\u0022https:\/\/aws.amazon.com\/cloudfront\/\u0022\u003ECloudfront\u003C\/a\u003E), and a more powerful web host (like \u003Ca href=\u0022https:\/\/pantheon.io\/\u0022\u003EPantheon\u003C\/a\u003E). \u0026nbsp;A performant site on Pantheon will\u0026nbsp;\u003Cem\u003Ealways\u003C\/em\u003E perform better than a site running off a four year old laptop.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EWorkflow\u003C\/h2\u003E\n\u003Cp\u003EI\u0027ve got another reason why I prefer Panels: it has a much better workflow. \u0026nbsp;Here\u0027s a comparison of what it takes to achieve the same results with Blocks and Panels:\u003C\/p\u003E\n\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003E\n\u003Cp\u003ECreate theme template with regions\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003EUpdate theme.info file\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003ECreate multiple templates for multiple content types\u003C\/p\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003ECreate a Panels Page\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003C\/tbody\u003E\n\u003C\/table\u003E\n\u003Cp\u003EIf you want different layouts in different parts of the site (eg. different content types), it gets worse:\u003C\/p\u003E\n\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003EContext, Display Suite, or multiple duplicate blocks with different visibility rules\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003ECreate a variant\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003C\/tbody\u003E\n\u003C\/table\u003E\n\u003Cp\u003EHeaven help you if you want to switch themes at any point. \u0026nbsp;Add in nifty features like \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panelizer\u0022\u003EPanelizer\u003C\/a\u003E or the In-Place Editor, and Panels is not just easier, but more powerful too. \u0026nbsp;Here\u0027s a full rundown of the pros and cons:\u003C\/p\u003E\n\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\u0026nbsp;\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EPros\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003EEasier to do responsive theming\u003C\/li\u003E\n\u003Cli\u003EBuilt in\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003EMore powerful\u003C\/li\u003E\n\u003Cli\u003EMore performant\u003C\/li\u003E\n\u003Cli\u003ETheme-independent\u003C\/li\u003E\n\u003Cli\u003EEasier to use\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003ECons\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003ELayout tied to individual themes\u003C\/li\u003E\n\u003Cli\u003ERequires handmade theme templates\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003ENot as friendly to responsive design\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003C\/tbody\u003E\n\u003C\/table\u003E\n\u003Cp\u003EThere are exceptions, of course. \u0026nbsp;\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/panopoly\u0022\u003EPanopoly\u003C\/a\u003E is 100% panels-based and has some excellent responsive layouts. \u0026nbsp;But those were custom made for the project.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EThe Pudding\u003C\/h2\u003E\n\u003Cp\u003E. . . is where the proof is. \u0026nbsp;So they say. \u0026nbsp;On this site, I use both. \u0026nbsp;The general layout is done with blocks. \u0026nbsp;This is a completely custom theme made with \u003Ca href=\u0022https:\/\/sass-lang.com\/\u0022\u003ESASS\u003C\/a\u003E, so it was actually quite easy to create layout; I didn\u0027t need to customize the templates at all. \u0026nbsp;(I did anyway, but for other reasons.) \u0026nbsp;My \u003Ca href=\u0022\/portfolio\u0022\u003Eportfolio\u003C\/a\u003E, on the other hand, is a series of panels pages: one for the overview and a panelized page for each site in my gallery. \u0026nbsp;So, what\u0027s the rule here?\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EIt Depends\u003C\/h2\u003E\n\u003Cp\u003EI hate saying that, but it\u0027s true. \u0026nbsp;You can use Blocks 100% of the time or Panels 100% of the time, but you will find that one technique is better suited to one task and one technique is better suited to others. \u0026nbsp;Here are some general rules which might help:\u003C\/p\u003E\n\u003Ctable border=\u00223\u0022 cellpadding=\u00221\u0022 cellspacing=\u00221\u0022 style=\u0022width: 500px;\u0022\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd\u003E\u0026nbsp;\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EBlocks\u003C\/strong\u003E\u003C\/td\u003E\n\u003Ctd\u003E\u003Cstrong\u003EPanels\u003C\/strong\u003E\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003Ctr\u003E\n\u003Ctd\u003EWhen It\u0027s Better\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003EYou\u0027re building a custom theme anyway\u003C\/li\u003E\n\u003Cli\u003EYou don\u0027t mind your layout being theme-specific\u003C\/li\u003E\n\u003Cli\u003EResponsive design\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003Ctd\u003E\n\u003Cul\u003E\n\u003Cli\u003ESpecific layout requirements for specific pages \/ areas \/ content types\u003C\/li\u003E\n\u003Cli\u003EYou\u0027re not creating a custom theme\u003C\/li\u003E\n\u003Cli\u003EWant your layout to be theme-independent\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/td\u003E\n\u003C\/tr\u003E\n\u003C\/tbody\u003E\n\u003C\/table\u003E\n\u003Cp\u003EBottom line: I still prefer Panels, generally speaking. \u0026nbsp;It\u0027s newer, fancier, more powerful, easier, and more compatible. \u0026nbsp;But I\u0027m not going to be religious about it; sometimes Blocks is a better fit.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1359060870,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":19}],"uuid":[{"value":"043a038f-c3e3-47e3-a66c-dee54385277c"}],"vid":[{"value":288}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"People like my stuff"}],"created":[{"value":"2013-01-08T00:22:11+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/people-my-stuff","pid":52,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EA little under a week since I started publishing projects on Drupal.org, and my work is starting to get used. \u00a0So far I\u0027ve published three projects:\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003EFormat Headers\u003C\/a\u003E\u003C\/strong\u003E, a module that gives extra styling options to titles for blocks and panes\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003ELetter\u003C\/a\u003E\u003C\/strong\u003E, a simple Zen sub-theme that includes built-in webfont support\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003EKandS\u003C\/a\u003E\u003C\/strong\u003E, a more advanced Zen sub-theme made with SASS. \u00a0It includes responsive layout and an off-canvas menu for mobile devices.\u003C\/p\u003E\u003Cp\u003EIn under a week, these three projects have been downloaded a total of 122 times, and are being actively used on 26 sites.\u003C\/p\u003E\u003Cp\u003EAnd \u003Cem\u003Ezero reported issues\u003C\/em\u003E.\u003C\/p\u003E\u003Cp\u003EIt\u0027s not as popular as the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/views\u0022\u003EViews module\u003C\/a\u003E, to be sure, but it shows that people like my work enough to use it themselves. \u00a0It also tells me that my work is pretty good, if a couple dozen people are using my module and themes and not a single one has had a complaint yet.\u003C\/p\u003E\u003Cp\u003EIt\u0027s incredibly gratifying to me as a Drupal developer to know that I\u0027m finally giving back to the community. \u00a0This is how open source is supposed to work.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EA little under a week since I started publishing projects on Drupal.org, and my work is starting to get used. \u0026nbsp;So far I\u0027ve published three projects:\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003EFormat Headers\u003C\/a\u003E\u003C\/strong\u003E, a module that gives extra styling options to titles for blocks and panes\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003ELetter\u003C\/a\u003E\u003C\/strong\u003E, a simple Zen sub-theme that includes built-in webfont support\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003EKandS\u003C\/a\u003E\u003C\/strong\u003E, a more advanced Zen sub-theme made with SASS. \u0026nbsp;It includes responsive layout and an off-canvas menu for mobile devices.\u003C\/p\u003E\n\u003Cp\u003EIn under a week, these three projects have been downloaded a total of 122 times, and are being actively used on 26 sites.\u003C\/p\u003E\n\u003Cp\u003EAnd \u003Cem\u003Ezero reported issues\u003C\/em\u003E.\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s not as popular as the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/views\u0022\u003EViews module\u003C\/a\u003E, to be sure, but it shows that people like my work enough to use it themselves. \u0026nbsp;It also tells me that my work is pretty good, if a couple dozen people are using my module and themes and not a single one has had a complaint yet.\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s incredibly gratifying to me as a Drupal developer to know that I\u0027m finally giving back to the community. \u0026nbsp;This is how open source is supposed to work.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1357604531,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":18}],"uuid":[{"value":"31760462-1218-4f90-aecb-ecbdca983ba7"}],"vid":[{"value":282}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Another theme: KandS"}],"created":[{"value":"2013-01-01T23:27:58+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/another-theme-kands","pid":51,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve taken the custom theme for this website and \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003Emade it available on Drupal.org\u003C\/a\u003E. \u00a0It\u0027s much more advanced than \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003Emy first offering\u003C\/a\u003E. \u00a0Features include:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EWebfont support through the theme settings page\u003C\/li\u003E\u003Cli\u003ECustom splash image, also through the theme settings page\u003C\/li\u003E\u003Cli\u003EResponsive layout with SASS and Zen-Grids\u003C\/li\u003E\u003Cli\u003EOff-canvas menu for mobile\u003C\/li\u003E\u003Cli\u003EManicules!\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThere are two layouts: regular and mobile. Mobile is designed to be viewed on\u00a0anything the size of an iPad or smaller and will resize to fit the viewing area. \u00a0It uses Zen-Grids which is built into Zen 5. The regular layout goes up to\u00a01280 px.\u003C\/p\u003E\u003Cp\u003EIn the mobile layout, the sidebar turns into an off-canvas menu. It will\u00a0automatically resize to fit the viewing area, and also to fit the contents\u00a0of the region.\u003C\/p\u003E\u003Cdiv\u003EI\u0027m not done yet; I still have two more modules in the pipeline. \u00a0But I\u0027d say 2013 is off to a good start. \u00a0:-)\u003C\/div\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve taken the custom theme for this website and \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003Emade it available on Drupal.org\u003C\/a\u003E. \u0026nbsp;It\u0027s much more advanced than \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003Emy first offering\u003C\/a\u003E. \u0026nbsp;Features include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EWebfont support through the theme settings page\u003C\/li\u003E\n\u003Cli\u003ECustom splash image, also through the theme settings page\u003C\/li\u003E\n\u003Cli\u003EResponsive layout with SASS and Zen-Grids\u003C\/li\u003E\n\u003Cli\u003EOff-canvas menu for mobile\u003C\/li\u003E\n\u003Cli\u003EManicules!\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThere are two layouts: regular and mobile. Mobile is designed to be viewed on\u0026nbsp;anything the size of an iPad or smaller and will resize to fit the viewing area. \u0026nbsp;It uses Zen-Grids which is built into Zen 5. The regular layout goes up to\u0026nbsp;1280 px.\u003C\/p\u003E\n\u003Cp\u003EIn the mobile layout, the sidebar turns into an off-canvas menu. It will\u0026nbsp;automatically resize to fit the viewing area, and also to fit the contents\u0026nbsp;of the region.\u003C\/p\u003E\n\u003Cdiv\u003EI\u0027m not done yet; I still have two more modules in the pipeline. \u0026nbsp;But I\u0027d say 2013 is off to a good start. \u0026nbsp;:-)\u003C\/div\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1357082897,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":17}],"uuid":[{"value":"b2b3ce22-b44c-46fe-b545-6ae506e165a0"}],"vid":[{"value":321}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-01-08T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"My First Module"}],"created":[{"value":"2013-01-01T17:39:31+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-01-08T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/my-first-module","pid":50,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ERight on the heals of \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003Emy first Drupal.org submission\u003C\/a\u003E comes \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003Emy first module\u003C\/a\u003E. \u00a0I\u0027ve been working with Drupal for 7 years now but never had the need before. \u00a0There are almost \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/project_module\u0022\u003E20,000 community-contributed modules\u003C\/a\u003E on Drupal.org and I\u0027ve always been able to make due with \u0022standard\u0022 solutions, even if it involved a bit of php code inside a view, webform, or theme template file.\u003C\/p\u003E\u003Cp\u003EBut \u003Ca href=\u0022\/node\/16\u0022\u003Eas I\u0027ve said before\u003C\/a\u003E, my goal now is to become a better developer. \u00a0And to that end, I offer my first module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003EFormat Headers\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EThe premise is simple: it offers CSS formatting for block and pane titles, and you can have different formatting for uppercase and lowercase. \u00a0Block and pane titles are simple text fields in Drupal and don\u0027t allow special formatting, other than what you can do in your theme, so this is a new function.\u003C\/p\u003E\u003Cp\u003EThe backstory: several months ago I applied to work at a high-end web design agency. \u00a0I told them at the time that I had never come across a programming challenge that I was unable to beat. \u00a0At the time, it was true. \u00a0They gave me a demonstration project which I failed, partly because I couldn\u0027t figure out how to do special formatting on panels pane titles. \u00a0(This is well beyond what you can do with pure css.) \u00a0Then I got hired at another company, had a second kid, and life got in the way. \u00a0Now I\u0027ve got some time, so I\u0027m breaking through the wall.\u003C\/p\u003E\u003Cp\u003EMuch like my first submission, professional pride played a role here. \u00a0The reason for this module existing is an edge case from a demo project that ended several months ago. \u00a0I have no idea how many people will need a module like this. \u00a0But I can once again say that I have never come across a programming challenge that I was unable to beat.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ERight on the heals of \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003Emy first Drupal.org submission\u003C\/a\u003E comes \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003Emy first module\u003C\/a\u003E. \u0026nbsp;I\u0027ve been working with Drupal for 7 years now but never had the need before. \u0026nbsp;There are almost \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/project_module\u0022\u003E20,000 community-contributed modules\u003C\/a\u003E on Drupal.org and I\u0027ve always been able to make due with \u0022standard\u0022 solutions, even if it involved a bit of php code inside a view, webform, or theme template file.\u003C\/p\u003E\n\u003Cp\u003EBut \u003Ca href=\u0022\/node\/16\u0022\u003Eas I\u0027ve said before\u003C\/a\u003E, my goal now is to become a better developer. \u0026nbsp;And to that end, I offer my first module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/formatheaders\u0022\u003EFormat Headers\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EThe premise is simple: it offers CSS formatting for block and pane titles, and you can have different formatting for uppercase and lowercase. \u0026nbsp;Block and pane titles are simple text fields in Drupal and don\u0027t allow special formatting, other than what you can do in your theme, so this is a new function.\u003C\/p\u003E\n\u003Cp\u003EThe backstory: several months ago I applied to work at a high-end web design agency. \u0026nbsp;I told them at the time that I had never come across a programming challenge that I was unable to beat. \u0026nbsp;At the time, it was true. \u0026nbsp;They gave me a demonstration project which I failed, partly because I couldn\u0027t figure out how to do special formatting on panels pane titles. \u0026nbsp;(This is well beyond what you can do with pure css.) \u0026nbsp;Then I got hired at another company, had a second kid, and life got in the way. \u0026nbsp;Now I\u0027ve got some time, so I\u0027m breaking through the wall.\u003C\/p\u003E\n\u003Cp\u003EMuch like my first submission, professional pride played a role here. \u0026nbsp;The reason for this module existing is an edge case from a demo project that ended several months ago. \u0026nbsp;I have no idea how many people will need a module like this. \u0026nbsp;But I can once again say that I have never come across a programming challenge that I was unable to beat.\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1357061971,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":16}],"uuid":[{"value":"434bbf7c-f9bb-4578-b376-1a3e3f2306e9"}],"vid":[{"value":285}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"I\u0027m a contributor!"}],"created":[{"value":"2013-01-01T06:50:04+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/im-contributor","pid":49,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EIt\u0027s official: I\u0027m a full-fledged contributor on Drupal.org. \u00a0This just happened over the weekend, as \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Emy first project was formally approved\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003EThe project\u003C\/a\u003E is a rather simple theme (visual design) that I originally made for \u003Ca href=\u0022https:\/\/www.acwa.org\/\u0022\u003EACWA.org\u003C\/a\u003E. \u00a0I photographed a piece of letter stationary on my own desk at home, and turned it into a Drupal 7 theme. \u00a0I originally submitted it almost a year ago, but got distracted with \u0022real\u0022 work. \u00a0Now I\u0027m between jobs and had time to go back. \u00a0I\u0027ve done much more advanced work since then, and was tempted to submit a better project for approval. \u00a0But I went back and put in the work out of a sense of professional pride. \u00a0I don\u0027t give up and walk away from projects. \u00a0A week and a half later, and I got it approved.\u003C\/p\u003E\u003Cp\u003EI\u0027ve got another, much more advanced theme that I\u0027m preparing to contribute, plus a few modules. \u00a0I\u0027ll also be adding blog posts here based on some of the research I\u0027ve done lately. \u00a02013 is going to be a big year; stay tuned. \u00a0:-)\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EIt\u0027s official: I\u0027m a full-fledged contributor on Drupal.org. \u0026nbsp;This just happened over the weekend, as \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Emy first project was formally approved\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003EThe project\u003C\/a\u003E is a rather simple theme (visual design) that I originally made for \u003Ca href=\u0022https:\/\/www.acwa.org\/\u0022\u003EACWA.org\u003C\/a\u003E. \u0026nbsp;I photographed a piece of letter stationary on my own desk at home, and turned it into a Drupal 7 theme. \u0026nbsp;I originally submitted it almost a year ago, but got distracted with \u0022real\u0022 work. \u0026nbsp;Now I\u0027m between jobs and had time to go back. \u0026nbsp;I\u0027ve done much more advanced work since then, and was tempted to submit a better project for approval. \u0026nbsp;But I went back and put in the work out of a sense of professional pride. \u0026nbsp;I don\u0027t give up and walk away from projects. \u0026nbsp;A week and a half later, and I got it approved.\u003C\/p\u003E\n\u003Cp\u003EI\u0027ve got another, much more advanced theme that I\u0027m preparing to contribute, plus a few modules. \u0026nbsp;I\u0027ll also be adding blog posts here based on some of the research I\u0027ve done lately. \u0026nbsp;2013 is going to be a big year; stay tuned. \u0026nbsp;:-)\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1357023004,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":15}],"uuid":[{"value":"83b5cd32-9235-466f-9ab6-8c7c28002701"}],"vid":[{"value":353}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2020-11-11T01:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"We\u0027re Live"}],"created":[{"value":"2012-12-17T00:54:27+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2020-11-11T01:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/were-live","pid":48,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027m pleased to unveil my new DBA: Koplowicz \u0026amp; Sons. \u00a0This is the culmination of weeks worth of rebranding work. \u00a0In the process, I used several new technologies (at least, new to me):\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EDrupal 7 multisite\u003C\/strong\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EResponsive\u003C\/strong\u003E custom theme with \u003Cstrong\u003ESASS,\u003C\/strong\u003E\u00a0Zen 5.1, and Zen-Grids\u003C\/li\u003E\u003Cli\u003ETheme also uses the \u003Cstrong\u003EDrupal forms API\u003C\/strong\u003E for easier webfonts and splash image support\u003C\/li\u003E\u003Cli\u003ENew workflow with \u003Cstrong\u003EAptana, git and drush aliases\u003C\/strong\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EOff-canvas menu\u003C\/strong\u003E for mobile devices using \u003Cstrong\u003EHTML5, CSS3, javascript \u0026amp; jQuery\u003C\/strong\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThe website for Tenuki Design \u003Ca href=\u0022http:\/\/tenukidesign.com\u0022\u003Eis still up\u003C\/a\u003E, with a new front page. \u00a0I\u0027ve also updated my professional \u003Ca href=\u0022https:\/\/twitter.com\/koplowicznsons\u0022\u003ETwitter\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/www.facebook.com\/pages\/Tenuki-Design\/263581643674215\u0022\u003EFacebook\u003C\/a\u003E accounts; see the front page for all my professional networking links.\u003C\/p\u003E\u003Cp\u003EI\u0027ve got a lot of new content lined up, and will be posting it here as time allows.\u003C\/p\u003E\u003Cp\u003EThanks for visiting.\u003C\/p\u003E\u003Cp\u003ESincerely,\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003E\u003Cem\u003E--Jordan Koplowicz, Proprietor\u003C\/em\u003E\u003C\/strong\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027m pleased to unveil my new DBA: Koplowicz \u0026amp; Sons. \u0026nbsp;This is the culmination of weeks worth of rebranding work. \u0026nbsp;In the process, I used several new technologies (at least, new to me):\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EDrupal 7 multisite\u003C\/strong\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EResponsive\u003C\/strong\u003E custom theme with \u003Cstrong\u003ESASS,\u003C\/strong\u003E\u0026nbsp;Zen 5.1, and Zen-Grids\u003C\/li\u003E\n\u003Cli\u003ETheme also uses the \u003Cstrong\u003EDrupal forms API\u003C\/strong\u003E for easier webfonts and splash image support\u003C\/li\u003E\n\u003Cli\u003ENew workflow with \u003Cstrong\u003EAptana, git and drush aliases\u003C\/strong\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EOff-canvas menu\u003C\/strong\u003E for mobile devices using \u003Cstrong\u003EHTML5, CSS3, javascript \u0026amp; jQuery\u003C\/strong\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThe website for Tenuki Design \u003Ca href=\u0022http:\/\/tenukidesign.com\u0022\u003Eis still up\u003C\/a\u003E, with a new front page. \u0026nbsp;I\u0027ve also updated my professional \u003Ca href=\u0022https:\/\/twitter.com\/koplowicznsons\u0022\u003ETwitter\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/www.facebook.com\/pages\/Tenuki-Design\/263581643674215\u0022\u003EFacebook\u003C\/a\u003E accounts; see the front page for all my professional networking links.\u003C\/p\u003E\n\u003Cp\u003EI\u0027ve got a lot of new content lined up, and will be posting it here as time allows.\u003C\/p\u003E\n\u003Cp\u003EThanks for visiting.\u003C\/p\u003E\n\u003Cp\u003ESincerely,\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E\u003Cem\u003E--Jordan Koplowicz, Proprietor\u003C\/em\u003E\u003C\/strong\u003E\u003C\/p\u003E\n","summary":""}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1355705667,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":4}],"uuid":[{"value":"0b155907-4d54-4727-86a1-1c80267f071c"}],"vid":[{"value":385}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2023-05-25T11:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"About This Site"}],"created":[{"value":"2012-12-14T00:41:30+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2023-05-25T11:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":false}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/about-site","pid":2,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis site was built on a Drupal 7 multisite installation. \u00a0It is hosted by \u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003EHostgator\u003C\/a\u003E. \u00a0The visual design is a custom\u003Cstrong\u003E Drupal 7 theme\u003C\/strong\u003E called \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003Ekands\u003C\/a\u003E; you can download the theme and use it on your own site. \u00a0It was built using \u003Cstrong\u003ESASS\u003C\/strong\u003E and uses the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/zen\u0022\u003EZen 5 framework\u003C\/a\u003E, including \u003Ca href=\u0022http:\/\/zengrids.com\/\u0022\u003EZen Grids\u003C\/a\u003E, with\u00a0\u003Cstrong\u003Eresponsive design.\u003C\/strong\u003E \u00a0The off-canvas menu for the mobile layout uses \u003Cstrong\u003Ejavascript and jQuery\u003C\/strong\u003E. \u00a0Development was done locally on\u00a0\u003Ca href=\u0022https:\/\/ubuntu.com\/\u0022\u003EUbuntu\u003C\/a\u003E 12.10 using \u003Ca href=\u0022https:\/\/www.axway.com\/en\u0022\u003EAptana\u003C\/a\u003E, an integrated development environment. \u00a0I used git for version tracking and \u003Ca href=\u0022https:\/\/asana.com\/\u0022\u003EAsana\u003C\/a\u003E for project management.\u003C\/p\u003E\u003Cp\u003EThe page borders were taken from the title page of Schonberg\u0027s Atlas of the United States, 1867. \u00a0The logo is adapted from Davis\u0027 New Commercial Encyclopedia, 1909. \u00a0The \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Manicule\u0022\u003Emanicule\u003C\/a\u003E is from the \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/File:John_Wilkes_Booth_wanted_poster_new.jpg\u0022\u003Ewanted poster for John Wilkes Booth\u003C\/a\u003E, 1865. \u00a0It is unusual in that it shows the thumb in a raised position, like the hammer of a revolver.\u003C\/p\u003E\u003Cp style=\u0022text-align: center;\u0022\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20121312232642.png\u0022 \/\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThis site was built on a Drupal 7 multisite installation. \u0026nbsp;It is hosted by \u003Ca href=\u0022https:\/\/www.hostgator.com\/\u0022\u003EHostgator\u003C\/a\u003E. \u0026nbsp;The visual design is a custom\u003Cstrong\u003E Drupal 7 theme\u003C\/strong\u003E called \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/kands\u0022\u003Ekands\u003C\/a\u003E; you can download the theme and use it on your own site. \u0026nbsp;It was built using \u003Cstrong\u003ESASS\u003C\/strong\u003E and uses the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/zen\u0022\u003EZen 5 framework\u003C\/a\u003E, including \u003Ca href=\u0022http:\/\/zengrids.com\/\u0022\u003EZen Grids\u003C\/a\u003E, with\u0026nbsp;\u003Cstrong\u003Eresponsive design.\u003C\/strong\u003E \u0026nbsp;The off-canvas menu for the mobile layout uses \u003Cstrong\u003Ejavascript and jQuery\u003C\/strong\u003E. \u0026nbsp;Development was done locally on\u0026nbsp;\u003Ca href=\u0022https:\/\/ubuntu.com\/\u0022\u003EUbuntu\u003C\/a\u003E 12.10 using \u003Ca href=\u0022https:\/\/www.axway.com\/en\u0022\u003EAptana\u003C\/a\u003E, an integrated development environment. \u0026nbsp;I used git for version tracking and \u003Ca href=\u0022https:\/\/asana.com\/\u0022\u003EAsana\u003C\/a\u003E for project management.\u003C\/p\u003E\n\u003Cp\u003EThe page borders were taken from the title page of Schonberg\u0027s Atlas of the United States, 1867. \u0026nbsp;The logo is adapted from Davis\u0027 New Commercial Encyclopedia, 1909. \u0026nbsp;The \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Manicule\u0022\u003Emanicule\u003C\/a\u003E is from the \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/File:John_Wilkes_Booth_wanted_poster_new.jpg\u0022\u003Ewanted poster for John Wilkes Booth\u003C\/a\u003E, 1865. \u0026nbsp;It is unusual in that it shows the thumb in a raised position, like the hammer of a revolver.\u003C\/p\u003E\n\u003Cp style=\u0022text-align: center;\u0022\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20121312232642.png\u0022\u003E\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":3}],"uuid":[{"value":"e9fa6951-f898-4b37-beb6-2ae65039d8dd"}],"vid":[{"value":3}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2012-12-16T08:02:39+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Who We Are"}],"created":[{"value":"2012-12-13T23:43:46+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2012-12-16T08:02:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":false}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/about","pid":1,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EMy name is Jordan Koplowicz and I am the sole proprietor of Koplowicz \u0026amp; Sons. \u0026nbsp;I have been building websites for 13 years, and writing software a lot longer than that. \u0026nbsp;I have done it professionally since graduating from college. \u0026nbsp;Please see my portfolio for some examples of my work.\u003C\/p\u003E\u003Cp\u003EI work almost entirely with \u003Cstrong\u003Econtent management systems\u003C\/strong\u003E, especially Drupal. \u0026nbsp;I employ the latest techniques, including \u003Cstrong\u003Eresponsive design and SASS\u003C\/strong\u003E.\u003C\/p\u003E\u003Cp\u003EI live in San Francisco with my wife and two sons. \u0026nbsp;My web practice was formerly named Tenuki Design. \u0026nbsp;The old site is still up if you\u0027d care to see another example of my work.\u003C\/p\u003E\u003Cp style=\u0022text-align: center;\u0022\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20121612000148.png\u0022\u003E\u003C\/p\u003E\u003Cp style=\u0022text-align: center;\u0022\u003E\u0026nbsp;\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EMy name is Jordan Koplowicz and I am the sole proprietor of Koplowicz \u0026amp; Sons. \u0026nbsp;I have been building websites for 13 years, and writing software a lot longer than that. \u0026nbsp;I have done it professionally since graduating from college. \u0026nbsp;Please see my portfolio for some examples of my work.\u003C\/p\u003E\n\u003Cp\u003EI work almost entirely with \u003Cstrong\u003Econtent management systems\u003C\/strong\u003E, especially Drupal. \u0026nbsp;I employ the latest techniques, including \u003Cstrong\u003Eresponsive design and SASS\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Cp\u003EI live in San Francisco with my wife and two sons. \u0026nbsp;My web practice was formerly named Tenuki Design. \u0026nbsp;The old site is still up if you\u0027d care to see another example of my work.\u003C\/p\u003E\n\u003Cp style=\u0022text-align: center;\u0022\u003E\u003Cimg alt src=\u0022\/sites\/koplowiczandsons.com\/files\/images\/20121612000148.png\u0022\u003E\u003C\/p\u003E\n\u003Cp style=\u0022text-align: center;\u0022\u003E\u0026nbsp;\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":2}],"uuid":[{"value":"c642c51d-1037-4225-a035-cf8c8060cbc5"}],"vid":[{"value":2}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2012-12-24T22:52:44+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Second Page"}],"created":[{"value":"2012-12-05T05:28:02+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2012-12-24T22:52:44+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":false}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":null,"pid":null,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis page demonstrates typeface use.\u003C\/p\u003E\u003Cdiv\u003EArrray, reducer proxy interface logistically prototype metafile solution high audio messaging echo. Adaptive feedback patch digital transponder computer encapsulated bus developer transponder integral read-only pc. Record harmonic disk, integer mainframe distributed bypass developer inversion, feedback. Logistically, cache integer, high developer pulse development potentiometer recognition with distributed feedback solution remote, remote. High plasma services development cable cable frequency recognition reducer patch proxy transistorized. Log, messaging developer frequency scalar silicon connectivity record connectivity transistorized reducer, inversion adaptive. Distributed processor system disk log logarithmic reducer recursive boolean sampling, connectivity hyperlinked phase backbone coordinated.\u0026nbsp;\u003C\/div\u003E\u003Ch2\u003ESub heading\u003C\/h2\u003E\u003Cp\u003E\u003Ci\u003Eitalic 1\u003C\/i\u003E \u003Cem\u003Eitalic 2\u003C\/em\u003E \u003Cb\u003Ebold 1\u003C\/b\u003E \u003Cstrong\u003Ebold 2\u003C\/strong\u003E \u003Ci\u003E\u003Cb\u003Ebold strong\u003C\/b\u003E\u003C\/i\u003E \u003Cb\u003E\u003Ci\u003Ebold strong\u003C\/i\u003E\u003C\/b\u003E \u003Cem\u003E\u003Cstrong\u003Ebold strong\u003C\/strong\u003E\u003C\/em\u003E \u003Cstrong\u003E\u003Cem\u003Ebold strong\u003C\/em\u003E\u003C\/strong\u003E\u003C\/p\u003E\r\n\u003Cpre\u003E\u200bexample code\u003C\/pre\u003E\r\n\u003Cp\u003EAnd here\u0027s a list:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EOne\u003C\/li\u003E\u003Cli\u003ETwo\u003C\/li\u003E\u003Cli\u003EThree\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003ELigature demonstration:\u003C\/p\u003E\u003Cp\u003Efine tasting coffee flavor\u003C\/p\u003E\u003Cp\u003E\ufb01ne ta\ufb06ing co\ufb00ee \ufb02avor\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThis page demonstrates typeface use.\u003C\/p\u003E\n\u003Cdiv\u003EArrray, reducer proxy interface logistically prototype metafile solution high audio messaging echo. Adaptive feedback patch digital transponder computer encapsulated bus developer transponder integral read-only pc. Record harmonic disk, integer mainframe distributed bypass developer inversion, feedback. Logistically, cache integer, high developer pulse development potentiometer recognition with distributed feedback solution remote, remote. High plasma services development cable cable frequency recognition reducer patch proxy transistorized. Log, messaging developer frequency scalar silicon connectivity record connectivity transistorized reducer, inversion adaptive. Distributed processor system disk log logarithmic reducer recursive boolean sampling, connectivity hyperlinked phase backbone coordinated.\u0026nbsp;\u003C\/div\u003E\n\u003Ch2\u003ESub heading\u003C\/h2\u003E\n\u003Cp\u003E\u003Ci\u003Eitalic 1\u003C\/i\u003E \u003Cem\u003Eitalic 2\u003C\/em\u003E \u003Cb\u003Ebold 1\u003C\/b\u003E \u003Cstrong\u003Ebold 2\u003C\/strong\u003E \u003Ci\u003E\u003Cb\u003Ebold strong\u003C\/b\u003E\u003C\/i\u003E \u003Cb\u003E\u003Ci\u003Ebold strong\u003C\/i\u003E\u003C\/b\u003E \u003Cem\u003E\u003Cstrong\u003Ebold strong\u003C\/strong\u003E\u003C\/em\u003E \u003Cstrong\u003E\u003Cem\u003Ebold strong\u003C\/em\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cpre\u003E\u200bexample code\u003C\/pre\u003E\u003Cp\u003EAnd here\u0027s a list:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EOne\u003C\/li\u003E\n\u003Cli\u003ETwo\u003C\/li\u003E\n\u003Cli\u003EThree\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ELigature demonstration:\u003C\/p\u003E\n\u003Cp\u003Efine tasting coffee flavor\u003C\/p\u003E\n\u003Cp\u003E\ufb01ne ta\ufb06ing co\ufb00ee \ufb02avor\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":1}],"uuid":[{"value":"efeed283-026d-4a82-a63e-55d5e58896bd"}],"vid":[{"value":392}],"langcode":[{"value":"und"}],"type":[{"target_id":"page","target_type":"node_type","target_uuid":"a37ab863-b7be-48a3-9a04-d3a51527ac57"}],"revision_timestamp":[{"value":"2024-04-17T18:35:24+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Home"}],"created":[{"value":"2012-12-05T00:55:31+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:35:24+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":false}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":null,"pid":null,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis is Koplowicz \u0026amp; Sons, a \u003Cstrong\u003Eweb design and development \u003C\/strong\u003Efirm located in San Francisco. \u0026nbsp;We specialize in:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EContent management systems, particularly \u003Cstrong\u003EDrupal, Wordpress, and Joomla\u003C\/strong\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EE-commerce\u003C\/strong\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ESocial media\u003C\/strong\u003E, including Facebook, Twitter, LinkedIn, and Yelp. \u0026nbsp;We can also build a\u0026nbsp;\u003Cstrong\u003EFacebook app\u003C\/strong\u003E for your business.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ESearch Engine Optimization\u003C\/strong\u003E (SEO)\u003C\/li\u003E\u003Cli\u003ECustom theme design, including mobile-friendly\u0026nbsp;\u003Cstrong\u003Eresponsive design\u003C\/strong\u003E\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EDatabase design\u003C\/strong\u003E, including rich media (photos, videos, audio, documents, maps)\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EWe use only the finest technologies, including \u003Cstrong\u003EHTML5, CSS3, jQuery, SASS, and cloud computing\u003C\/strong\u003E.\u003C\/p\u003E\u003Cp\u003EI invite you to view our \u003Ca href=\u0022\/portfolio\u0022\u003Eportfolio\u003C\/a\u003E and \u003Ca href=\u0022\/frontpage\u0022\u003Eblog\u003C\/a\u003E. \u0026nbsp;You can also connect with us via social media (see below).\u003C\/p\u003E\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESincerely,\u003C\/span\u003E\u003C\/p\u003E\u003Cp style=\u0022font-family: \u0027MonotypeScriptW01-Bold\u0027; font-size: 1.4em;\u0022\u003EJordan Koplowicz, Proprietor\u003C\/p\u003E","format":"raw_html","processed":"\u003Cp\u003EThis is Koplowicz \u0026amp; Sons, a \u003Cstrong\u003Eweb design and development \u003C\/strong\u003Efirm located in San Francisco. \u0026nbsp;We specialize in:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EContent management systems, particularly \u003Cstrong\u003EDrupal, Wordpress, and Joomla\u003C\/strong\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EE-commerce\u003C\/strong\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003ESocial media\u003C\/strong\u003E, including Facebook, Twitter, LinkedIn, and Yelp. \u0026nbsp;We can also build a\u0026nbsp;\u003Cstrong\u003EFacebook app\u003C\/strong\u003E for your business.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003ESearch Engine Optimization\u003C\/strong\u003E (SEO)\u003C\/li\u003E\n\u003Cli\u003ECustom theme design, including mobile-friendly\u0026nbsp;\u003Cstrong\u003Eresponsive design\u003C\/strong\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EDatabase design\u003C\/strong\u003E, including rich media (photos, videos, audio, documents, maps)\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EWe use only the finest technologies, including \u003Cstrong\u003EHTML5, CSS3, jQuery, SASS, and cloud computing\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Cp\u003EI invite you to view our \u003Ca href=\u0022\/portfolio\u0022\u003Eportfolio\u003C\/a\u003E and \u003Ca href=\u0022\/frontpage\u0022\u003Eblog\u003C\/a\u003E. \u0026nbsp;You can also connect with us via social media (see below).\u003C\/p\u003E\n\u003Cp\u003E\u003Cspan style=\u0022line-height: 1.538em;\u0022\u003ESincerely,\u003C\/span\u003E\u003C\/p\u003E\n\u003Cp style=\u0022font-family: \u0027MonotypeScriptW01-Bold\u0027; font-size: 1.4em;\u0022\u003EJordan Koplowicz, Proprietor\u003C\/p\u003E\n","summary":""}]},{"nid":[{"value":63}],"uuid":[{"value":"afd15e89-d9dc-4b72-b90c-032924dd23dc"}],"vid":[{"value":63}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"New Sites"}],"created":[{"value":"2012-10-26T06:37:47+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/new-sites","pid":97,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve published three new sites in the last month! \u0026nbsp;Most notable for me is the new \u003Ca href=\u0022\/portfolio\/49\u0022\u003EPACWR.org\u003C\/a\u003E. \u0026nbsp;The old PACWR webmaster died last year, and I was selected to replace him. \u0026nbsp;I chose to host this site using Wordpress. \u0026nbsp;I generally prefer Drupal but this was intended to be a simpler site, and a perfect test bed for the CMS.\u003C\/p\u003E\u003Cp\u003EAlso noteworthy are two sites I created for Gutensite. \u0026nbsp;One is for a Canadian church and the other is for a San Francisco realtor. \u0026nbsp;These sites were built using Gutensite\u0027s proprietary CMS: a heady mix of php, css, and smarty tags. \u0026nbsp;I employed new design techniques, including Adobe CS 6 Fireworks and pixel-perfect matching to the design document.\u003C\/p\u003E\u003Cp\u003EAll three sites are listed in my portfolio:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/49\u0022\u003EPACWR.org\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/46\u0022\u003ETenth Church\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/47\u0022\u003ENina Hatvany\u003C\/a\u003E\u003C\/li\u003E\u003C\/ul\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve published three new sites in the last month! \u0026nbsp;Most notable for me is the new \u003Ca href=\u0022\/portfolio\/49\u0022\u003EPACWR.org\u003C\/a\u003E. \u0026nbsp;The old PACWR webmaster died last year, and I was selected to replace him. \u0026nbsp;I chose to host this site using Wordpress. \u0026nbsp;I generally prefer Drupal but this was intended to be a simpler site, and a perfect test bed for the CMS.\u003C\/p\u003E\n\u003Cp\u003EAlso noteworthy are two sites I created for Gutensite. \u0026nbsp;One is for a Canadian church and the other is for a San Francisco realtor. \u0026nbsp;These sites were built using Gutensite\u0027s proprietary CMS: a heady mix of php, css, and smarty tags. \u0026nbsp;I employed new design techniques, including Adobe CS 6 Fireworks and pixel-perfect matching to the design document.\u003C\/p\u003E\n\u003Cp\u003EAll three sites are listed in my portfolio:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/49\u0022\u003EPACWR.org\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/46\u0022\u003ETenth Church\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022\/portfolio\/47\u0022\u003ENina Hatvany\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":62}],"uuid":[{"value":"c800bbde-d18b-4680-b711-e09219c9f1de"}],"vid":[{"value":313}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Automatic User Filtering"}],"created":[{"value":"2012-10-24T19:25:53+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/automatic-user-filtering","pid":96,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI run the website for a large local non-profit and I have people signing up for accounts every week. \u00a0The problem is most of them are spammers, and some simply don\u0027t belong; website accounts are for members only. \u00a0I have four solutions to this problem:\u003C\/p\u003E\u003Col\u003E\u003Cli\u003ESpam protection (using Mollom)\u003C\/li\u003E\u003Cli\u003ENotice on the signup page (using blocks)\u003C\/li\u003E\u003Cli\u003ECustom account management screen (using Views)\u003C\/li\u003E\u003Cli\u003EAutomatic account filtering (using Rules)\u003C\/li\u003E\u003C\/ol\u003E\u003Cp\u003EIn this blog post I\u0027ll walk through all four. \u00a0The first three solutions didn\u0027t quite take care of the problem but the last one will.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003ESpam Protection: Mollom\u003C\/h2\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/mollom\u0022\u003EMollom\u003C\/a\u003E is a spam filter, but it\u0027s more than that. \u00a0Most spam filters use a technique called CAPTCHA, which is where you have to type the letters you see in a picture on the screen. \u00a0That\u0027s old school. \u00a0Mollom actually\u00a0\u003Cem\u003Ereads\u003C\/em\u003E the post and decides whether it\u0027s legit or a spammer. \u00a0It\u0027s got a central database and performs heuristic analysis. \u00a0If that doesn\u0027t work, it uses CAPTCHA as a fall back. \u00a0It\u0027s industrial level protection, free for low-traffic sites, and it\u0027s the only anti-spam solution you\u0027ll ever need. \u00a0Here\u0027s how to use it.\u003C\/p\u003E\u003Ch3\u003E1. Install Mollom\u003C\/h3\u003E\u003Cp\u003EUse your favorite method. \u00a0I like drush:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Edrush dl mollom\ndrush en mollom\u003C\/pre\u003E\n\u003Ch3\u003E2. Sign up for an account\u003C\/h3\u003E\u003Cp\u003EGo to\u00a0\u003Ca href=\u0022https:\/\/www.mollom.com\/\u0022\u003Ehttps:\/\/www.mollom.com\/\u003C\/a\u003E\u00a0and sign up for an account. \u00a0Free for personal, non-profit, and low volume users.\u003C\/p\u003E\u003Ch3\u003E3. Assign forms\u003C\/h3\u003E\u003Cp\u003EGo to yoursite\/admin\/config\/content\/mollom and add forms, eg. comments, user registration, etc. \u00a0On the options page you can choose whether you want it to do analysis or just CAPTCHA. \u00a0CAPTCHA is more foolproof, but it adds an additional hoop for legitimate users to jump through.\u003C\/p\u003E\u003Cp\u003EThat\u0027s it! \u00a0Mollom comes with excellent reporting so you can see how much spam it\u0027s protected you from. \u00a0On one website alone, Mollom saved me from 650 spam posts in the last 242 days, while letting in all the legitimate posts.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003ESignup Notice: Blocks\u003C\/h2\u003E\u003Cp\u003EThis one is pretty simple. \u00a0Go to yoursite\/admin\/structure\/block\/add and create a new block with instructions on how to sign up. \u00a0Then specify that the block is only to show up on specified pages, and add\u00a0user\/register to the list. \u00a0Now you\u0027ve got a signup announcement that only appears on the signup page, and you didn\u0027t even have to use panels or templates.\u003C\/p\u003E\u003Cp\u003EIn my case, I added extra fields to the signup page and put up an announcement that accounts will be rejected unless they meet certain criteria. \u00a0So if you\u0027re a human being and you\u0027re actually reading the instructions, you\u0027ll know what the right answer is. \u00a0Seems like a pretty easy gate to open, but spammers aren\u0027t good at that kind of thing.\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EAccount Management: Views\u003C\/h2\u003E\u003Cp\u003EI get several signups per week, so I created a custom View that lists users with some details to help me figure out who\u0027s legit. \u00a0It\u0027s a simple table layout that gives the user name, \u0022about me\u0022 field, date they applied, and a couple links to view or edit the user. \u00a0It automatically filters out users who are already approved, so it\u0027s only showing me users who are still waiting for approval. \u00a0I exposed this filter in the View so I can view\u00a0\u003Cem\u003Eall\u00a0\u003C\/em\u003Eusers if I want. \u00a0I added this to my menu and restricted it to administrators only.\u003C\/p\u003E\u003Cp\u003EUsing this table, I can tell at a glance who\u0027s a legitimate user and who\u0027s a spammer. \u00a0Here\u0027s what my configuration looks like:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/default\/files\/Members%20%20User%20%20%20%20ACWA.org-142325.png\u0022 style=\u0022width: 800px; height: 433px; \u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003E\u00a0\u003C\/p\u003E\u003Ch2\u003EAutomatic Filtering: Rules\u003C\/h2\u003E\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/rules\u0022\u003ERules\u003C\/a\u003E is one of those \u0022meta\u0022 modules that you can ignore until you need it. \u00a0The idea is that when an event occurs on your website, such as a blog post, there is a rule for what will happen next. \u00a0This is not to be confused with the core module called Triggers, which kinda does the same thing, but with far less functionality. \u00a0You don\u0027t need Triggers but you do need Rules. \u00a0Once you install Rules, it refers to actions as \u0022reaction rules,\u0022 which makes more sense.\u003C\/p\u003E\u003Cp\u003EIn my case, it was fairly simple to create a reaction rule with a simple task. \u00a0Whenever someone applied for a new account, it would check to see if they had selected a certain option on the signup page. \u00a0If they chose the wrong option, it delete the account, send an email to the user explaining why it was rejecting the account, and send another email to me letting me know. \u00a0Here\u0027s what my configuration screen looks like:\u003C\/p\u003E\u003Cp\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/default\/files\/Editing%20reaction%20rule%20%20Remove%20unauthorized%20user%20%20%20%20ACWA.org-150201.png\u0022 style=\u0022width: 800px; height: 544px; \u0022 \/\u003E\u003C\/p\u003E\u003Cp\u003EHere\u0027s how you get there:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EEvent:\u003C\/strong\u003E\u00a0\u0022After saving a new user account.\u0022 \u00a0In other words, when someone signs up. \u00a0(This also counts if you create the account as an administrator.)\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EConditions:\u003C\/strong\u003E I chose \u0022data comparison,\u0022 then I picked the right answer from the field on the registration form. \u00a0Then I checked the box for \u0022Negate,\u0022 which means the rule will only trigger if the user does \u003Cem\u003Enot\u003C\/em\u003E select the right answer.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EActions:\u00a0\u003C\/strong\u003EA few things happen here.\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ESend mail:\u003C\/strong\u003E I sent two emails, one to myself explaining that the user was deleted, and another to the user explaining that they were deleted (and why). \u00a0I also offered recourse in case they were deleted unfairly. \u00a0For the return address I put \u0022no-reply,\u0022 because I don\u0027t want a spammer getting my email address.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EDelete entity:\u003C\/strong\u003E The system actually deletes the account, saving me the trouble. \u00a0But it also sends me an email letting me know it\u0027s done so, so I can at least supervise.\u003C\/li\u003E\u003C\/ul\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EI know this seems like a lot of steps to keep out spammers. \u00a0But the result is a system that works well, still allows legitimate people to participate, and keeps your workflow to a minimum.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI run the website for a large local non-profit and I have people signing up for accounts every week. \u0026nbsp;The problem is most of them are spammers, and some simply don\u0027t belong; website accounts are for members only. \u0026nbsp;I have four solutions to this problem:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003ESpam protection (using Mollom)\u003C\/li\u003E\n\u003Cli\u003ENotice on the signup page (using blocks)\u003C\/li\u003E\n\u003Cli\u003ECustom account management screen (using Views)\u003C\/li\u003E\n\u003Cli\u003EAutomatic account filtering (using Rules)\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EIn this blog post I\u0027ll walk through all four. \u0026nbsp;The first three solutions didn\u0027t quite take care of the problem but the last one will.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003ESpam Protection: Mollom\u003C\/h2\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/mollom\u0022\u003EMollom\u003C\/a\u003E is a spam filter, but it\u0027s more than that. \u0026nbsp;Most spam filters use a technique called CAPTCHA, which is where you have to type the letters you see in a picture on the screen. \u0026nbsp;That\u0027s old school. \u0026nbsp;Mollom actually\u0026nbsp;\u003Cem\u003Ereads\u003C\/em\u003E the post and decides whether it\u0027s legit or a spammer. \u0026nbsp;It\u0027s got a central database and performs heuristic analysis. \u0026nbsp;If that doesn\u0027t work, it uses CAPTCHA as a fall back. \u0026nbsp;It\u0027s industrial level protection, free for low-traffic sites, and it\u0027s the only anti-spam solution you\u0027ll ever need. \u0026nbsp;Here\u0027s how to use it.\u003C\/p\u003E\n\u003Ch3\u003E1. Install Mollom\u003C\/h3\u003E\n\u003Cp\u003EUse your favorite method. \u0026nbsp;I like drush:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Edrush dl mollom\ndrush en mollom\u003C\/pre\u003E\u003Ch3\u003E2. Sign up for an account\u003C\/h3\u003E\n\u003Cp\u003EGo to\u0026nbsp;\u003Ca href=\u0022https:\/\/www.mollom.com\/\u0022\u003Ehttps:\/\/www.mollom.com\/\u003C\/a\u003E\u0026nbsp;and sign up for an account. \u0026nbsp;Free for personal, non-profit, and low volume users.\u003C\/p\u003E\n\u003Ch3\u003E3. Assign forms\u003C\/h3\u003E\n\u003Cp\u003EGo to yoursite\/admin\/config\/content\/mollom and add forms, eg. comments, user registration, etc. \u0026nbsp;On the options page you can choose whether you want it to do analysis or just CAPTCHA. \u0026nbsp;CAPTCHA is more foolproof, but it adds an additional hoop for legitimate users to jump through.\u003C\/p\u003E\n\u003Cp\u003EThat\u0027s it! \u0026nbsp;Mollom comes with excellent reporting so you can see how much spam it\u0027s protected you from. \u0026nbsp;On one website alone, Mollom saved me from 650 spam posts in the last 242 days, while letting in all the legitimate posts.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003ESignup Notice: Blocks\u003C\/h2\u003E\n\u003Cp\u003EThis one is pretty simple. \u0026nbsp;Go to yoursite\/admin\/structure\/block\/add and create a new block with instructions on how to sign up. \u0026nbsp;Then specify that the block is only to show up on specified pages, and add\u0026nbsp;user\/register to the list. \u0026nbsp;Now you\u0027ve got a signup announcement that only appears on the signup page, and you didn\u0027t even have to use panels or templates.\u003C\/p\u003E\n\u003Cp\u003EIn my case, I added extra fields to the signup page and put up an announcement that accounts will be rejected unless they meet certain criteria. \u0026nbsp;So if you\u0027re a human being and you\u0027re actually reading the instructions, you\u0027ll know what the right answer is. \u0026nbsp;Seems like a pretty easy gate to open, but spammers aren\u0027t good at that kind of thing.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EAccount Management: Views\u003C\/h2\u003E\n\u003Cp\u003EI get several signups per week, so I created a custom View that lists users with some details to help me figure out who\u0027s legit. \u0026nbsp;It\u0027s a simple table layout that gives the user name, \u0022about me\u0022 field, date they applied, and a couple links to view or edit the user. \u0026nbsp;It automatically filters out users who are already approved, so it\u0027s only showing me users who are still waiting for approval. \u0026nbsp;I exposed this filter in the View so I can view\u0026nbsp;\u003Cem\u003Eall\u0026nbsp;\u003C\/em\u003Eusers if I want. \u0026nbsp;I added this to my menu and restricted it to administrators only.\u003C\/p\u003E\n\u003Cp\u003EUsing this table, I can tell at a glance who\u0027s a legitimate user and who\u0027s a spammer. \u0026nbsp;Here\u0027s what my configuration looks like:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/default\/files\/Members%20%20User%20%20%20%20ACWA.org-142325.png\u0022 style=\u0022width: 800px; height: 433px; \u0022\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch2\u003EAutomatic Filtering: Rules\u003C\/h2\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/rules\u0022\u003ERules\u003C\/a\u003E is one of those \u0022meta\u0022 modules that you can ignore until you need it. \u0026nbsp;The idea is that when an event occurs on your website, such as a blog post, there is a rule for what will happen next. \u0026nbsp;This is not to be confused with the core module called Triggers, which kinda does the same thing, but with far less functionality. \u0026nbsp;You don\u0027t need Triggers but you do need Rules. \u0026nbsp;Once you install Rules, it refers to actions as \u0022reaction rules,\u0022 which makes more sense.\u003C\/p\u003E\n\u003Cp\u003EIn my case, it was fairly simple to create a reaction rule with a simple task. \u0026nbsp;Whenever someone applied for a new account, it would check to see if they had selected a certain option on the signup page. \u0026nbsp;If they chose the wrong option, it delete the account, send an email to the user explaining why it was rejecting the account, and send another email to me letting me know. \u0026nbsp;Here\u0027s what my configuration screen looks like:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg alt src=\u0022\/sites\/default\/files\/Editing%20reaction%20rule%20%20Remove%20unauthorized%20user%20%20%20%20ACWA.org-150201.png\u0022 style=\u0022width: 800px; height: 544px; \u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s how you get there:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EEvent:\u003C\/strong\u003E\u0026nbsp;\u0022After saving a new user account.\u0022 \u0026nbsp;In other words, when someone signs up. \u0026nbsp;(This also counts if you create the account as an administrator.)\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EConditions:\u003C\/strong\u003E I chose \u0022data comparison,\u0022 then I picked the right answer from the field on the registration form. \u0026nbsp;Then I checked the box for \u0022Negate,\u0022 which means the rule will only trigger if the user does \u003Cem\u003Enot\u003C\/em\u003E select the right answer.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EActions:\u0026nbsp;\u003C\/strong\u003EA few things happen here.\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003ESend mail:\u003C\/strong\u003E I sent two emails, one to myself explaining that the user was deleted, and another to the user explaining that they were deleted (and why). \u0026nbsp;I also offered recourse in case they were deleted unfairly. \u0026nbsp;For the return address I put \u0022no-reply,\u0022 because I don\u0027t want a spammer getting my email address.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EDelete entity:\u003C\/strong\u003E The system actually deletes the account, saving me the trouble. \u0026nbsp;But it also sends me an email letting me know it\u0027s done so, so I can at least supervise.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EI know this seems like a lot of steps to keep out spammers. \u0026nbsp;But the result is a system that works well, still allows legitimate people to participate, and keeps your workflow to a minimum.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":61}],"uuid":[{"value":"cc5aeb5e-6411-4811-99db-d4e519f69f9a"}],"vid":[{"value":311}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Drupal and the Lost Art of the Bookmarklet"}],"created":[{"value":"2012-05-04T20:03:53+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/drupal-and-lost-art-bookmarklet","pid":95,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThis article is mostly about one thing: creating a simple little \u0022blog this\u0022 bookmark for your web browser. \u00a0But it reaches into larger issues of Drupal vs. Wordpress, and D6 vs. D7.\u003C\/p\u003E\u003Cp\u003EWordpress has this nifty little feature where, when you find an interesting web page somewhere, simply press a button on your web browser and it will automatically create a new blog post for you, based on the web page you were looking at. \u00a0 \u00a0This is called a \u0022bookmarklet.\u0022 \u00a0It\u0027s one of the many, many reasons why people think Wordpress is easier than Drupal. \u00a0It\u0027s not that you can\u0027t do this in Drupal; it\u0027s just that it takes a lot of work to set up, versus being handed to you automatically in Wordpress.\u003C\/p\u003E\u003Cp\u003ESome people have turned this into a holy war, but \u003Ca href=\u0022https:\/\/www.chapterthree.com\/blog\/jennifer-lampton\/wordpress-vs-drupal-saga-continues\u0022\u003Ecalmer heads have pointed out\u003C\/a\u003E that Wordpress is good at some things, and Drupal is good at others.\u003C\/p\u003E\u003Cp\u003ESo, how do you do it in Drupal? \u00a0The most popular method involves the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/prepopulate\u0022\u003EPrepopulate Module\u003C\/a\u003E, which lets you create new content with certain fields already filled out. \u00a0\u003Ca href=\u0022http:\/\/www.drupaldork.com\/comment\/195\u0022\u003EMost people like to write a little javascript\u003C\/a\u003E that sets it up just how they like it. \u00a0For Drupal 7, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/quickpost_bookmarklet\u0022\u003Ethere\u0027s a module for that\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003ESo, the discussion should end there, right? \u00a0If you can throw together a couple modules, then what\u0027s the problem? \u00a0The problem, of course, is if you\u0027re still running Drupal 6. \u00a0A lot of people are, myself included. \u00a0No one ever came up with a good migration path from D6 to D7, and that\u0027s fine because D6 is still a very fine piece of software, still runs very well, still receives bug fixes and security updates, and still has more modules available than D7. \u00a0In my case, I\u0027ve got a multi-site installation with 4-5 different sites all running off the same Drupal core. \u00a0It would be a very large task to migrate them all to D7, even if an adequate upgrade path existed, and I\u0027m doing most of these sites for free (for \u003Ca href=\u0022https:\/\/www.69thnewyork.com\/\u0022\u003Ea non-profit organization\u003C\/a\u003E).\u003C\/p\u003E\u003Cp\u003EThe best bookmarklet script I\u0027ve found was from \u003Ca href=\u0022http:\/\/www.drupaldork.com\/comment\/195\u0022\u003EBrock Boland\u003C\/a\u003E, who also wrote the D7 module. \u00a0I modified it slightly to fit my own uses:\u003C\/p\u003E\u003Cblockquote\u003E\u003Cp\u003Ejavascript: var siteURL=\u0027koplowicz.com\u0027, nodeType=\u0027blog\u0027, d=document, w=window, e=w.getSelection, k=d.getSelection, x=d.selection, s=(e?e():(k)?k():(x?x.createRange().text:0)), l=d.location.href.replace(\u0022http:\/\/\u0022,\u0022\u0022), e=encodeURIComponent, url=\u0027http:\/\/\u0027+siteURL+\u0027\/node\/add\/\u0027+nodeType+\u0027?edit[title]=\u0027+e(d.title); if(s) { s=\u0027\u0026lt;blockquote\u0026gt;\u0027+s+\u0027\u0026lt;\/blockquote\u0026gt;\u0027; s+=\u0027\\n\\nfrom \u0027+l; url+=\u0027\u0026amp;edit[body_field][body]=\u0027+e(s);} a=function(){if(!w.open(url,\u0027quickpost\u0027,\u0027toolbar=0,resizable=1,scrollbars=1,status=1,width=1024,height=570\u0027)) l.href=url;}; if (\/Firefox\/.test(navigator.userAgent)) setTimeout(a, 0); else a();void(0)\u003C\/p\u003E\u003C\/blockquote\u003E\u003Cp\u003EObviously you will have to modify the script for yourself. \u00a0Don\u0027t bother trying to post content to koplowicz.com; you don\u0027t have permission. \u00a0(Koplowicz.com is my personal blog, and is separate from my web design business.)\u003C\/p\u003E\u003Cp\u003EBottom line: It is still possible to do everything in Drupal that you can do in Wordpress. \u00a0Just takes more work. \u00a0Of course, that begs the question: if Wordpress can have this handy feature built-in, why not Drupal? \u00a0There\u0027s no reason why simple features should be harder. \u00a0The only answer is that we\u0027re waiting for someone to write it. \u00a0Both projects are open source and community-supported, so this isn\u0027t a problem; it\u0027s an invitation.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThis article is mostly about one thing: creating a simple little \u0022blog this\u0022 bookmark for your web browser. \u0026nbsp;But it reaches into larger issues of Drupal vs. Wordpress, and D6 vs. D7.\u003C\/p\u003E\n\u003Cp\u003EWordpress has this nifty little feature where, when you find an interesting web page somewhere, simply press a button on your web browser and it will automatically create a new blog post for you, based on the web page you were looking at. \u0026nbsp; \u0026nbsp;This is called a \u0022bookmarklet.\u0022 \u0026nbsp;It\u0027s one of the many, many reasons why people think Wordpress is easier than Drupal. \u0026nbsp;It\u0027s not that you can\u0027t do this in Drupal; it\u0027s just that it takes a lot of work to set up, versus being handed to you automatically in Wordpress.\u003C\/p\u003E\n\u003Cp\u003ESome people have turned this into a holy war, but \u003Ca href=\u0022https:\/\/www.chapterthree.com\/blog\/jennifer-lampton\/wordpress-vs-drupal-saga-continues\u0022\u003Ecalmer heads have pointed out\u003C\/a\u003E that Wordpress is good at some things, and Drupal is good at others.\u003C\/p\u003E\n\u003Cp\u003ESo, how do you do it in Drupal? \u0026nbsp;The most popular method involves the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/prepopulate\u0022\u003EPrepopulate Module\u003C\/a\u003E, which lets you create new content with certain fields already filled out. \u0026nbsp;\u003Ca href=\u0022http:\/\/www.drupaldork.com\/comment\/195\u0022\u003EMost people like to write a little javascript\u003C\/a\u003E that sets it up just how they like it. \u0026nbsp;For Drupal 7, \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/quickpost_bookmarklet\u0022\u003Ethere\u0027s a module for that\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003ESo, the discussion should end there, right? \u0026nbsp;If you can throw together a couple modules, then what\u0027s the problem? \u0026nbsp;The problem, of course, is if you\u0027re still running Drupal 6. \u0026nbsp;A lot of people are, myself included. \u0026nbsp;No one ever came up with a good migration path from D6 to D7, and that\u0027s fine because D6 is still a very fine piece of software, still runs very well, still receives bug fixes and security updates, and still has more modules available than D7. \u0026nbsp;In my case, I\u0027ve got a multi-site installation with 4-5 different sites all running off the same Drupal core. \u0026nbsp;It would be a very large task to migrate them all to D7, even if an adequate upgrade path existed, and I\u0027m doing most of these sites for free (for \u003Ca href=\u0022https:\/\/www.69thnewyork.com\/\u0022\u003Ea non-profit organization\u003C\/a\u003E).\u003C\/p\u003E\n\u003Cp\u003EThe best bookmarklet script I\u0027ve found was from \u003Ca href=\u0022http:\/\/www.drupaldork.com\/comment\/195\u0022\u003EBrock Boland\u003C\/a\u003E, who also wrote the D7 module. \u0026nbsp;I modified it slightly to fit my own uses:\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cp\u003Ejavascript: var siteURL=\u0027koplowicz.com\u0027, nodeType=\u0027blog\u0027, d=document, w=window, e=w.getSelection, k=d.getSelection, x=d.selection, s=(e?e():(k)?k():(x?x.createRange().text:0)), l=d.location.href.replace(\u0022http:\/\/\u0022,\u0022\u0022), e=encodeURIComponent, url=\u0027http:\/\/\u0027+siteURL+\u0027\/node\/add\/\u0027+nodeType+\u0027?edit[title]=\u0027+e(d.title); if(s) { s=\u0027\u0026lt;blockquote\u0026gt;\u0027+s+\u0027\u0026lt;\/blockquote\u0026gt;\u0027; s+=\u0027\\n\\nfrom \u0027+l; url+=\u0027\u0026amp;edit[body_field][body]=\u0027+e(s);} a=function(){if(!w.open(url,\u0027quickpost\u0027,\u0027toolbar=0,resizable=1,scrollbars=1,status=1,width=1024,height=570\u0027)) l.href=url;}; if (\/Firefox\/.test(navigator.userAgent)) setTimeout(a, 0); else a();void(0)\u003C\/p\u003E\n\u003C\/blockquote\u003E\n\u003Cp\u003EObviously you will have to modify the script for yourself. \u0026nbsp;Don\u0027t bother trying to post content to koplowicz.com; you don\u0027t have permission. \u0026nbsp;(Koplowicz.com is my personal blog, and is separate from my web design business.)\u003C\/p\u003E\n\u003Cp\u003EBottom line: It is still possible to do everything in Drupal that you can do in Wordpress. \u0026nbsp;Just takes more work. \u0026nbsp;Of course, that begs the question: if Wordpress can have this handy feature built-in, why not Drupal? \u0026nbsp;There\u0027s no reason why simple features should be harder. \u0026nbsp;The only answer is that we\u0027re waiting for someone to write it. \u0026nbsp;Both projects are open source and community-supported, so this isn\u0027t a problem; it\u0027s an invitation.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":60}],"uuid":[{"value":"1bea68be-010f-46b0-8887-762dad62bfcc"}],"vid":[{"value":309}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Meta Tags Don\u0027t Help SEO"}],"created":[{"value":"2012-03-28T16:25:22+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/meta-tags-dont-help-seo","pid":94,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EApparently this is old news, but \u003Ca href=\u0022https:\/\/webmasters.googleblog.com\/2009\/09\/google-does-not-use-keywords-meta-tag.html\u0022\u003EGoogle no longer looks at meta tags for SEO\u003C\/a\u003E. \u00a0This is news because for the first 10 years, they did. \u00a0It\u0027s also news because most SEO \u0022experts\u0022 still seem to think that meta tags are important. \u00a0The truth is they\u00a0\u003Cem\u003Eare\u003C\/em\u003E, but not for SEO.\u003C\/p\u003E\u003Cp\u003EFacebook uses meta tags for their new Open Graph standard (at least until they change everyone\u0027s profile page again). \u00a0Google also uses meta tags for displaying more information about a page in the search results, but neither of those things actually help SEO.\u003C\/p\u003E\u003Cp\u003ESo, what\u00a0\u003Cem\u003Edoes\u003C\/em\u003E help SEO? \u00a0\u003Ca href=\u0022\/node\/15\u0022\u003EA lot of other things\u003C\/a\u003E. \u00a0As I\u0027ve said before, Google has never released their algorythm so it\u0027s somewhat of a black box, and it does change over time. \u00a0But they\u0027ve given us certain clues, like the announcement on meta tags. \u00a0\u003C\/p\u003E\u003Cp\u003EAre meta tags still useful? \u00a0Yes, just not in the context of SEO.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EApparently this is old news, but \u003Ca href=\u0022https:\/\/webmasters.googleblog.com\/2009\/09\/google-does-not-use-keywords-meta-tag.html\u0022\u003EGoogle no longer looks at meta tags for SEO\u003C\/a\u003E. \u0026nbsp;This is news because for the first 10 years, they did. \u0026nbsp;It\u0027s also news because most SEO \u0022experts\u0022 still seem to think that meta tags are important. \u0026nbsp;The truth is they\u0026nbsp;\u003Cem\u003Eare\u003C\/em\u003E, but not for SEO.\u003C\/p\u003E\n\u003Cp\u003EFacebook uses meta tags for their new Open Graph standard (at least until they change everyone\u0027s profile page again). \u0026nbsp;Google also uses meta tags for displaying more information about a page in the search results, but neither of those things actually help SEO.\u003C\/p\u003E\n\u003Cp\u003ESo, what\u0026nbsp;\u003Cem\u003Edoes\u003C\/em\u003E help SEO? \u0026nbsp;\u003Ca href=\u0022\/node\/15\u0022\u003EA lot of other things\u003C\/a\u003E. \u0026nbsp;As I\u0027ve said before, Google has never released their algorythm so it\u0027s somewhat of a black box, and it does change over time. \u0026nbsp;But they\u0027ve given us certain clues, like the announcement on meta tags. \u0026nbsp;\u003C\/p\u003E\n\u003Cp\u003EAre meta tags still useful? \u0026nbsp;Yes, just not in the context of SEO.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":59}],"uuid":[{"value":"7b5c5cba-39bf-4de7-a5f2-65720d91eea8"}],"vid":[{"value":308}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"New site: ACWA.org"}],"created":[{"value":"2012-02-29T09:39:04+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/new-site-acwaorg","pid":93,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/www.acwa.org\/\u0022\u003EACWA\u003C\/a\u003E is a non-profit organization I\u0027ve belonged to for a very long time, and I recently took over the job of webmaster. \u00a0The old site was written in HTML with Dreamweaver, so naturally I upgraded it to Drupal. \u00a0Other improvements include:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003EMultiple custom databases with custom content types and Views, including \u003Ca href=\u0022https:\/\/www.acwa.org\/gallery\u0022\u003Ecustom photo gallery\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003ECustom Drupal 7 theme (which I\u0027ve \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Esubmitted to Drupal.org\u003C\/a\u003E), with a webfont from 1788\u003C\/li\u003E\u003Cli\u003EEvent list with \u003Ca href=\u0022https:\/\/www.acwa.org\/events\/map\u0022\u003Eintegrated Google Maps\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003EBlogs, forums and newsletters to encourage user interaction\u003C\/li\u003E\u003Cli\u003EIntegrated social networking with Facebook and LinkedIn\u003C\/li\u003E\u003Cli\u003EGoogle Apps for email, calendar, etc.\u003C\/li\u003E\u003Cli\u003EIntegrated with Google Analytics and Google Webmaster Tools with automatic XML sitemap submission to maximize SEO\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThe ACWA is a fine organization and I am proud to donate my time as webmaster to help the cause.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/www.acwa.org\/\u0022\u003EACWA\u003C\/a\u003E is a non-profit organization I\u0027ve belonged to for a very long time, and I recently took over the job of webmaster. \u0026nbsp;The old site was written in HTML with Dreamweaver, so naturally I upgraded it to Drupal. \u0026nbsp;Other improvements include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EMultiple custom databases with custom content types and Views, including \u003Ca href=\u0022https:\/\/www.acwa.org\/gallery\u0022\u003Ecustom photo gallery\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003ECustom Drupal 7 theme (which I\u0027ve \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Esubmitted to Drupal.org\u003C\/a\u003E), with a webfont from 1788\u003C\/li\u003E\n\u003Cli\u003EEvent list with \u003Ca href=\u0022https:\/\/www.acwa.org\/events\/map\u0022\u003Eintegrated Google Maps\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003EBlogs, forums and newsletters to encourage user interaction\u003C\/li\u003E\n\u003Cli\u003EIntegrated social networking with Facebook and LinkedIn\u003C\/li\u003E\n\u003Cli\u003EGoogle Apps for email, calendar, etc.\u003C\/li\u003E\n\u003Cli\u003EIntegrated with Google Analytics and Google Webmaster Tools with automatic XML sitemap submission to maximize SEO\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThe ACWA is a fine organization and I am proud to donate my time as webmaster to help the cause.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":58}],"uuid":[{"value":"eb0fabb3-0bb8-4d41-ae48-530343a21e04"}],"vid":[{"value":325}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2019-01-08T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Community-Contributed Themes"}],"created":[{"value":"2012-02-28T02:32:44+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2019-01-08T03:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/community-contributed-themes","pid":92,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI\u0027ve written before about the advantages of \u003Cstrong\u003EOpen Source Software\u003C\/strong\u003E, including content management systems like Drupal. \u00a0One of the advantages is that there\u0027s a whole ecosystem of community-contributed stuff for you to use, including extra functionality and visual themes. \u00a0Many of them are quite good. \u00a0The result is a much shorter development cycle, which saves you time and money.\u003C\/p\u003E\u003Cp\u003EBut what about when you have to create something from scratch, like a \u003Cstrong\u003Ecustom Drupal theme\u003C\/strong\u003E? \u00a0It only makes sense to give back to the community by submitting your theme to Drupal.org. \u00a0That\u0027s exactly what I\u0027ve done; I created a \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003EDrupal 7 theme\u003C\/a\u003E for a non-profit website and I\u0027ve \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Esubmitted it to be published\u003C\/a\u003E as an official community-contributed theme on Drupal.org.\u003C\/p\u003E\u003Cp\u003EThis follows the \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022\u003Emodule patch\u003C\/a\u003E I submitted last year.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI\u0027ve written before about the advantages of \u003Cstrong\u003EOpen Source Software\u003C\/strong\u003E, including content management systems like Drupal. \u0026nbsp;One of the advantages is that there\u0027s a whole ecosystem of community-contributed stuff for you to use, including extra functionality and visual themes. \u0026nbsp;Many of them are quite good. \u0026nbsp;The result is a much shorter development cycle, which saves you time and money.\u003C\/p\u003E\n\u003Cp\u003EBut what about when you have to create something from scratch, like a \u003Cstrong\u003Ecustom Drupal theme\u003C\/strong\u003E? \u0026nbsp;It only makes sense to give back to the community by submitting your theme to Drupal.org. \u0026nbsp;That\u0027s exactly what I\u0027ve done; I created a \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/letter\u0022\u003EDrupal 7 theme\u003C\/a\u003E for a non-profit website and I\u0027ve \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1459628\u0022\u003Esubmitted it to be published\u003C\/a\u003E as an official community-contributed theme on Drupal.org.\u003C\/p\u003E\n\u003Cp\u003EThis follows the \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022\u003Emodule patch\u003C\/a\u003E I submitted last year.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":57}],"uuid":[{"value":"356f4a86-8c1e-4ca0-bb5b-b4763822e2b5"}],"vid":[{"value":305}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Drush, Hostgator, and Me"}],"created":[{"value":"2012-01-13T00:38:17+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2024-04-17T18:33:39+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/drush-hostgator-and-me","pid":91,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ESo, I recently discovered \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/drush\u0022\u003EDrush\u003C\/a\u003E. \u00a0I may be late to the game, but this is the coolest thing since \u003Ca href=\u0022\/node\/3\u0022\u003ECCK\u003C\/a\u003E and \u003Ca href=\u0022\/node\/10\u0022\u003EViews\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EIn plain English: remember how computers used to be nothing but a black screen and white text? \u00a0(Or green text, or orange, depending on how old you are.) \u00a0Well, that\u0027s called the \u003Cstrong\u003ECommand Line Interface\u003C\/strong\u003E and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Propeller_cap\u0022\u003Epropeller-heads\u003C\/a\u003E like myself still use it. \u00a0Why? \u00a0Because it\u0027s powerful. \u00a0I mostly use it for installing and upgrading software.\u003C\/p\u003E\u003Cp\u003E\u0022But web design happens on web pages. \u00a0How would the CLI help with that?\u0022 \u00a0Well, remember that \u003Ca href=\u0022\/node\/9\u0022\u003Eweb pages exist on web servers\u003C\/a\u003E. \u00a0And those servers all have command line interfaces. \u00a0What does this mean? \u00a0This means things that used to take half an hour - and dozens of mouse clicks - can now be done with a single command. \u00a0My productivity is already soaring.\u003C\/p\u003E\u003Cp\u003EThe downside: it was difficult to set up, and required some futzing. \u00a0I found a couple excellent guides that got me most of the way there, but had to piece together the final bits myself. \u00a0If you\u0027re reading this, you may have had the same problem, so here it is, my guide on\u003C\/p\u003E\u003Ch2\u003EHow to Install Drush on Hostgator\u003C\/h2\u003E\u003Cp\u003E1. \u003Cstrong\u003EAsk Hostgator for SSH access.\u003C\/strong\u003E \u00a0You have to file a support ticket request, but it\u0027s a simple matter of them flipping a switch for you. \u00a0They did mine in under 24 hours.\u003C\/p\u003E\u003Cp\u003E2. \u003Cstrong\u003EInstall Drush.\u003C\/strong\u003E \u00a0The easiest way is to download the latest package from \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/drush\u0022\u003EDrupal.org\u003C\/a\u003E, unzip it, and upload it to your Drupal directory using ftp. \u00a0You can also ssh in and use wget and unzip it directly on the server (see Step #4 below). \u00a0\u003Cstrong\u003ENote:\u003C\/strong\u003E It says the only version available is for 7.x. \u00a0\u003Cem\u003EIt works with Drupal 6 too\u003C\/em\u003E. \u00a0Just go with it.\u003C\/p\u003E\u003Cp\u003E3.\u00a0\u003Cstrong\u003EConfigure Drush.\u003C\/strong\u003E \u00a0Using ftp or ssh, go back to your root directory (\/home\/username, a.k.a. ~) and edit the file .bash-profile . \u00a0It\u0027s a hidden file so your ftp client may not see it right away, but it\u0027s there. \u00a0Using ssh it looks like this:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ecd ~; pico .bashrc\u003C\/pre\u003E\n\u003Cp\u003EAdd the following code to the end:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ealias drush=\u0027php \/home\/[user]\/public_html\/drush\/drush.php\u0027\nalias php=\u0027\/usr\/bin\/php-cli\u0027\n# Fix to allow Drush aliases to work\nPATH=$PATH:$HOME\/bin:\/home\/calwease\/drush\nexport PATH\u003C\/pre\u003E\n\u003Cp\u003E4. \u003Cstrong\u003ESSH to your server\u003C\/strong\u003E (if you haven\u0027t already). \u00a0If you\u0027re using Windows, I recommend \u003Ca href=\u0022https:\/\/download.cnet.com\/PuTTY\/3000-7240_4-10808581.html?tag=mncol;1\u0022\u003EPutty\u003C\/a\u003E. \u00a0On Mac OS or Linux, all you have to do is:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Essh -p 2222 user@yourwebsite.com\u003C\/pre\u003E\n\u003Cp\u003EOnce you\u0027ve logged on to your server, do the following:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ecd public_html\ndrush update\u003C\/pre\u003E\n\u003Cp\u003EIf it works, Drush will check your current Drupal installation to see if any modules need updating, and ask you if you want to proceed. \u00a0If you say \u0022yes,\u0022 Drush will download all the updates for you, install them, and run update.php for you. \u00a0\u003Cem\u003ECool, huh?\u003C\/em\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong\u003ENote:\u003C\/strong\u003E I\u0027ve found it only works if you\u0027re in your Drupal directory. \u00a0Theoretically you\u0027re supposed to be able to run Drush from anywhere on your server, but that never worked for me.\u003C\/p\u003E\u003Cp\u003EYes, it does take some work to set up, but it was worth it the first time I logged on and did a year\u0027s worth of updates in 60 seconds. \u00a0D7 makes it a little easier to manage installation and upgrades, but still can\u0027t touch Drush for convenience and power. \u00a0\u003Cem\u003EWowza\u003C\/em\u003E.\u003C\/p\u003E\u003Ch3\u003ETroubleshooting\u003C\/h3\u003E\u003Cp\u003EI recommend the following resources:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\u0022http:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u0022\u003Ehttp:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1349732\u0022\u003Ehttps:\/\/www.drupal.org\/node\/1349732\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1002698\u0022\u003Ehttps:\/\/www.drupal.org\/node\/1002698\u003C\/a\u003E\u003C\/li\u003E\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/drush?status=All\u0026amp;amp;amp;categories=All\u0022\u003Ehttp:\/\/drupal.org\/project\/issues\/drush\u003C\/a\u003E\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EHat tip to \u003Ca href=\u0022http:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u0022\u003EHolly\u003C\/a\u003E for getting me most of the way there.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ESo, I recently discovered \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/drush\u0022\u003EDrush\u003C\/a\u003E. \u0026nbsp;I may be late to the game, but this is the coolest thing since \u003Ca href=\u0022\/node\/3\u0022\u003ECCK\u003C\/a\u003E and \u003Ca href=\u0022\/node\/10\u0022\u003EViews\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EIn plain English: remember how computers used to be nothing but a black screen and white text? \u0026nbsp;(Or green text, or orange, depending on how old you are.) \u0026nbsp;Well, that\u0027s called the \u003Cstrong\u003ECommand Line Interface\u003C\/strong\u003E and \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Propeller_cap\u0022\u003Epropeller-heads\u003C\/a\u003E like myself still use it. \u0026nbsp;Why? \u0026nbsp;Because it\u0027s powerful. \u0026nbsp;I mostly use it for installing and upgrading software.\u003C\/p\u003E\n\u003Cp\u003E\u0022But web design happens on web pages. \u0026nbsp;How would the CLI help with that?\u0022 \u0026nbsp;Well, remember that \u003Ca href=\u0022\/node\/9\u0022\u003Eweb pages exist on web servers\u003C\/a\u003E. \u0026nbsp;And those servers all have command line interfaces. \u0026nbsp;What does this mean? \u0026nbsp;This means things that used to take half an hour - and dozens of mouse clicks - can now be done with a single command. \u0026nbsp;My productivity is already soaring.\u003C\/p\u003E\n\u003Cp\u003EThe downside: it was difficult to set up, and required some futzing. \u0026nbsp;I found a couple excellent guides that got me most of the way there, but had to piece together the final bits myself. \u0026nbsp;If you\u0027re reading this, you may have had the same problem, so here it is, my guide on\u003C\/p\u003E\n\u003Ch2\u003EHow to Install Drush on Hostgator\u003C\/h2\u003E\n\u003Cp\u003E1. \u003Cstrong\u003EAsk Hostgator for SSH access.\u003C\/strong\u003E \u0026nbsp;You have to file a support ticket request, but it\u0027s a simple matter of them flipping a switch for you. \u0026nbsp;They did mine in under 24 hours.\u003C\/p\u003E\n\u003Cp\u003E2. \u003Cstrong\u003EInstall Drush.\u003C\/strong\u003E \u0026nbsp;The easiest way is to download the latest package from \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/drush\u0022\u003EDrupal.org\u003C\/a\u003E, unzip it, and upload it to your Drupal directory using ftp. \u0026nbsp;You can also ssh in and use wget and unzip it directly on the server (see Step #4 below). \u0026nbsp;\u003Cstrong\u003ENote:\u003C\/strong\u003E It says the only version available is for 7.x. \u0026nbsp;\u003Cem\u003EIt works with Drupal 6 too\u003C\/em\u003E. \u0026nbsp;Just go with it.\u003C\/p\u003E\n\u003Cp\u003E3.\u0026nbsp;\u003Cstrong\u003EConfigure Drush.\u003C\/strong\u003E \u0026nbsp;Using ftp or ssh, go back to your root directory (\/home\/username, a.k.a. ~) and edit the file .bash-profile . \u0026nbsp;It\u0027s a hidden file so your ftp client may not see it right away, but it\u0027s there. \u0026nbsp;Using ssh it looks like this:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ecd ~; pico .bashrc\u003C\/pre\u003E\u003Cp\u003EAdd the following code to the end:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ealias drush=\u0027php \/home\/[user]\/public_html\/drush\/drush.php\u0027\nalias php=\u0027\/usr\/bin\/php-cli\u0027\n# Fix to allow Drush aliases to work\nPATH=$PATH:$HOME\/bin:\/home\/calwease\/drush\nexport PATH\u003C\/pre\u003E\u003Cp\u003E4. \u003Cstrong\u003ESSH to your server\u003C\/strong\u003E (if you haven\u0027t already). \u0026nbsp;If you\u0027re using Windows, I recommend \u003Ca href=\u0022https:\/\/download.cnet.com\/PuTTY\/3000-7240_4-10808581.html?tag=mncol;1\u0022\u003EPutty\u003C\/a\u003E. \u0026nbsp;On Mac OS or Linux, all you have to do is:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Essh -p 2222 user@yourwebsite.com\u003C\/pre\u003E\u003Cp\u003EOnce you\u0027ve logged on to your server, do the following:\u003C\/p\u003E\n\u003Cpre class=\u0022brush: bash\u0022\u003Ecd public_html\ndrush update\u003C\/pre\u003E\u003Cp\u003EIf it works, Drush will check your current Drupal installation to see if any modules need updating, and ask you if you want to proceed. \u0026nbsp;If you say \u0022yes,\u0022 Drush will download all the updates for you, install them, and run update.php for you. \u0026nbsp;\u003Cem\u003ECool, huh?\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ENote:\u003C\/strong\u003E I\u0027ve found it only works if you\u0027re in your Drupal directory. \u0026nbsp;Theoretically you\u0027re supposed to be able to run Drush from anywhere on your server, but that never worked for me.\u003C\/p\u003E\n\u003Cp\u003EYes, it does take some work to set up, but it was worth it the first time I logged on and did a year\u0027s worth of updates in 60 seconds. \u0026nbsp;D7 makes it a little easier to manage installation and upgrades, but still can\u0027t touch Drush for convenience and power. \u0026nbsp;\u003Cem\u003EWowza\u003C\/em\u003E.\u003C\/p\u003E\n\u003Ch3\u003ETroubleshooting\u003C\/h3\u003E\n\u003Cp\u003EI recommend the following resources:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022http:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u0022\u003Ehttp:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1349732\u0022\u003Ehttps:\/\/www.drupal.org\/node\/1349732\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/node\/1002698\u0022\u003Ehttps:\/\/www.drupal.org\/node\/1002698\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/issues\/drush?status=All\u0026amp;amp;amp;categories=All\u0022\u003Ehttp:\/\/drupal.org\/project\/issues\/drush\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EHat tip to \u003Ca href=\u0022http:\/\/www.themerforhire.com\/installing-drush-hostgator-shared-hosting\u0022\u003EHolly\u003C\/a\u003E for getting me most of the way there.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":56}],"uuid":[{"value":"2e71afdf-8abb-414d-88e2-27be4b73844c"}],"vid":[{"value":56}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"The Shame of Go Daddy"}],"created":[{"value":"2011-12-23T17:55:39+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/shame-go-daddy","pid":90,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EWell-known blogger @jkottke (100k+ followers on Twitter) recently said some disparaging things about Go Daddy. \u0026nbsp;This is confirmation of what I\u0027ve been saying for years.\u003C\/p\u003E\u003Cp\u003EUnlike Kottke, I\u0027ve actually had the displeasure of using Go Daddy. \u0026nbsp;He\u0027s right that they have sexist ads and their owner shoots elephants, but that\u0027s not why I hate them. \u0026nbsp;(Honestly, sex has been used in advertising since long before the internet, I don\u0027t really hate them for that.) \u0026nbsp;Here\u0027s why I hate Go Daddy:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003ETheir sites are slow. \u0026nbsp;\u003C\/strong\u003EYes, people are buying small slots on shared servers. \u0026nbsp;But I\u0027ve purchased similar low-end hosting accounts from half a dozen other service providers and they never run as poorly. \u0026nbsp;Yes, I\u0027m using Drupal, which is a very demanding piece of web software. \u0026nbsp;Still, Drupal runs better pretty much everywhere else.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EThey\u0027re always on the upsell. \u0026nbsp;\u003C\/strong\u003EIt\u0027s not enough that you give them money every month. \u0026nbsp;They want MORE. \u0026nbsp;Constantly. \u0026nbsp;Every time you log in, you have to wade through screen after screen of them trying to take more of your money. \u0026nbsp;Some of it is borderline dishonest, where you can click \u0022ok\u0022 just to make the screen go away, and you\u0027re really just purchased another (more expensive) product or service from them--most of which are completely useless. \u0026nbsp;Even when you do want to buy an additional service (like a new domain), it takes twice as long as it should because of all the times you have to say \u0022no, I don\u0027t want this extra shit too.\u0022 \u0026nbsp;Yes, it\u0027s a corporation and corporations need to make money, but I\u0027ve blogged before about how there are two kinds of companies: those who focus on making a superior product, and those who focus on squeezing their customers out of every penny. \u0026nbsp;Go Daddy is the latter.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ETheir interface is TERRIBLE. \u003C\/strong\u003E\u0026nbsp;I\u0027m quite a talented web designer, certainly know my way around a computer interface, and I\u0027ve got several years\u0027 experience managing various clients\u0027 sites on Go Daddy. \u0026nbsp;But I still get lost in their morass of an interface. \u0026nbsp;Want to do something simple like add an email account? \u0026nbsp;\u003Cem\u003EGood luck\u003C\/em\u003E. \u0026nbsp;I find myself bookmarking pages within their system because I won\u0027t know how to get back there again.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EThey don\u0027t have any \u0022perks\u0022 \u003C\/strong\u003Elike free SSH access. \u0026nbsp;It\u0027s true, that\u0027s a small thing, but if you\u0027re an advanced Drupal designer and you want to use Drush, it makes a difference. \u0026nbsp;Other hosts provide this for free, even on low-end accounts.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003EThey\u0027re not actually cheaper. \u003C\/strong\u003EThere are lots of other hosts that provide low-end accounts for the same price, or less, and offer equivalent features. \u0026nbsp;Everyone now offers unlimited storage, bandwidth, MySQL databases, and email accounts (or at least enough that you\u0027ll never run out). \u0026nbsp;And everyone has a plan for under $10\/month (very often under $5). \u0026nbsp;So you can\u0027t even say \u0022at least Go Daddy\u0027s crappy service comes with a smaller price tag\u0022 - because it doesn\u0027t.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EThere are some hosts where I\u0027ll tell a client \u0022you\u0027re not getting the best service, but it\u0027s not terrible, and it\u0027s not worth the hassle of migrating your entire site elsewhere. \u0026nbsp;You\u0027re fine where you are.\u0022 \u0026nbsp;I don\u0027t say that about Go Daddy. \u0026nbsp;Instead, I tell all my clients--and prospective clients--that they need to get away from Go Daddy. \u0026nbsp;Right now. \u0026nbsp;Even amateur do-it-yourselfers are going to suffer with Go Daddy. \u0026nbsp;They\u0027re the Walmart of the internet, and not in a good way.\u003C\/p\u003E\u003Cp\u003ESo, thank you Jason Kottke for raising the issue. \u0026nbsp;It needed to be said.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EWell-known blogger @jkottke (100k+ followers on Twitter) recently said some disparaging things about Go Daddy. \u0026nbsp;This is confirmation of what I\u0027ve been saying for years.\u003C\/p\u003E\n\u003Cp\u003EUnlike Kottke, I\u0027ve actually had the displeasure of using Go Daddy. \u0026nbsp;He\u0027s right that they have sexist ads and their owner shoots elephants, but that\u0027s not why I hate them. \u0026nbsp;(Honestly, sex has been used in advertising since long before the internet, I don\u0027t really hate them for that.) \u0026nbsp;Here\u0027s why I hate Go Daddy:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003ETheir sites are slow. \u0026nbsp;\u003C\/strong\u003EYes, people are buying small slots on shared servers. \u0026nbsp;But I\u0027ve purchased similar low-end hosting accounts from half a dozen other service providers and they never run as poorly. \u0026nbsp;Yes, I\u0027m using Drupal, which is a very demanding piece of web software. \u0026nbsp;Still, Drupal runs better pretty much everywhere else.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EThey\u0027re always on the upsell. \u0026nbsp;\u003C\/strong\u003EIt\u0027s not enough that you give them money every month. \u0026nbsp;They want MORE. \u0026nbsp;Constantly. \u0026nbsp;Every time you log in, you have to wade through screen after screen of them trying to take more of your money. \u0026nbsp;Some of it is borderline dishonest, where you can click \u0022ok\u0022 just to make the screen go away, and you\u0027re really just purchased another (more expensive) product or service from them--most of which are completely useless. \u0026nbsp;Even when you do want to buy an additional service (like a new domain), it takes twice as long as it should because of all the times you have to say \u0022no, I don\u0027t want this extra shit too.\u0022 \u0026nbsp;Yes, it\u0027s a corporation and corporations need to make money, but I\u0027ve blogged before about how there are two kinds of companies: those who focus on making a superior product, and those who focus on squeezing their customers out of every penny. \u0026nbsp;Go Daddy is the latter.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003ETheir interface is TERRIBLE. \u003C\/strong\u003E\u0026nbsp;I\u0027m quite a talented web designer, certainly know my way around a computer interface, and I\u0027ve got several years\u0027 experience managing various clients\u0027 sites on Go Daddy. \u0026nbsp;But I still get lost in their morass of an interface. \u0026nbsp;Want to do something simple like add an email account? \u0026nbsp;\u003Cem\u003EGood luck\u003C\/em\u003E. \u0026nbsp;I find myself bookmarking pages within their system because I won\u0027t know how to get back there again.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EThey don\u0027t have any \u0022perks\u0022 \u003C\/strong\u003Elike free SSH access. \u0026nbsp;It\u0027s true, that\u0027s a small thing, but if you\u0027re an advanced Drupal designer and you want to use Drush, it makes a difference. \u0026nbsp;Other hosts provide this for free, even on low-end accounts.\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EThey\u0027re not actually cheaper. \u003C\/strong\u003EThere are lots of other hosts that provide low-end accounts for the same price, or less, and offer equivalent features. \u0026nbsp;Everyone now offers unlimited storage, bandwidth, MySQL databases, and email accounts (or at least enough that you\u0027ll never run out). \u0026nbsp;And everyone has a plan for under $10\/month (very often under $5). \u0026nbsp;So you can\u0027t even say \u0022at least Go Daddy\u0027s crappy service comes with a smaller price tag\u0022 - because it doesn\u0027t.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThere are some hosts where I\u0027ll tell a client \u0022you\u0027re not getting the best service, but it\u0027s not terrible, and it\u0027s not worth the hassle of migrating your entire site elsewhere. \u0026nbsp;You\u0027re fine where you are.\u0022 \u0026nbsp;I don\u0027t say that about Go Daddy. \u0026nbsp;Instead, I tell all my clients--and prospective clients--that they need to get away from Go Daddy. \u0026nbsp;Right now. \u0026nbsp;Even amateur do-it-yourselfers are going to suffer with Go Daddy. \u0026nbsp;They\u0027re the Walmart of the internet, and not in a good way.\u003C\/p\u003E\n\u003Cp\u003ESo, thank you Jason Kottke for raising the issue. \u0026nbsp;It needed to be said.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":55}],"uuid":[{"value":"dd803844-5e57-4622-ad24-d8dfc72a1d74"}],"vid":[{"value":207}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Real-time tweeting from 150 years ago"}],"created":[{"value":"2011-12-19T23:41:19+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/real-time-tweeting-150-years-ago","pid":89,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI recently rolled out \u003Ca href=\u0022https:\/\/www.69thnewyork.com\/realtime\u0022\u003Ea new site feature\u003C\/a\u003E on \u003Ca href=\u0022\/portfolio\/20\u0022\u003E69thNewYork.com\u003C\/a\u003E, a site I maintain for a local non-profit. \u00a0It sends out at least one tweet every day 1861 (150 years ago). \u00a0The headlines of the day were dominated by the American Civil War, which had begun earlier that year.\u003C\/p\u003E\u003Cp\u003ETo make this feature work, I used a Drupal multi-site installation and created a new custom content type for the \u0022tweets,\u0022 with a scheduler so I can set up tweets ahead of time. \u00a0 I then used a reblogging service to automatically propagate the tweets to Twitter and Facebook. \u00a0You can also grab the raw rss feed (for those who still do such things).\u003C\/p\u003E\u003Cp\u003EThe result is a microblog that lets you\u00a0get a real sense of the war as an immediate thing with an uncertain end. \u00a0This is mainly for educational and informational purposes, but also a demonstration of how you can make the past come alive with Web 2.0.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI recently rolled out \u003Ca href=\u0022https:\/\/www.69thnewyork.com\/realtime\u0022\u003Ea new site feature\u003C\/a\u003E on \u003Ca href=\u0022\/portfolio\/20\u0022\u003E69thNewYork.com\u003C\/a\u003E, a site I maintain for a local non-profit. \u0026nbsp;It sends out at least one tweet every day 1861 (150 years ago). \u0026nbsp;The headlines of the day were dominated by the American Civil War, which had begun earlier that year.\u003C\/p\u003E\n\u003Cp\u003ETo make this feature work, I used a Drupal multi-site installation and created a new custom content type for the \u0022tweets,\u0022 with a scheduler so I can set up tweets ahead of time. \u0026nbsp; I then used a reblogging service to automatically propagate the tweets to Twitter and Facebook. \u0026nbsp;You can also grab the raw rss feed (for those who still do such things).\u003C\/p\u003E\n\u003Cp\u003EThe result is a microblog that lets you\u0026nbsp;get a real sense of the war as an immediate thing with an uncertain end. \u0026nbsp;This is mainly for educational and informational purposes, but also a demonstration of how you can make the past come alive with Web 2.0.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":54}],"uuid":[{"value":"85c2c29f-6331-4fe5-baa5-5f62328af4f0"}],"vid":[{"value":300}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Custom Drupal Modules"}],"created":[{"value":"2011-09-30T18:10:19+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-11-13T00:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/custom-drupal-modules-0","pid":88,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EI have submitted my first patch for a Drupal module. \u00a0It \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022 target=\u0022_blank\u0022\u003Eadds a major new feature\u003C\/a\u003E to the Follow module.\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003EQuick explanation\u003C\/em\u003E: You know how every site has links to Facebook now? \u00a0And LinkedIn, and Twitter, etc. \u00a0It\u0027s important to integrate your site with the popular \u003Ca href=\u0022\/social-networking\u0022\u003Esocial networks\u003C\/a\u003E. \u00a0But on site after site, I found myself hand-rolling blocks of content to display these links. \u00a0A famous mathematician said,\u00a0\u201cCivilization advances by extending the number of important operations which we can perform without thinking about them.\u201d \u00a0Is there an easier way to add social networking links? \u00a0Of course there is: the Follow module.\u003C\/p\u003E\u003Cp\u003EThis is the beauty of an open-source \u003Ca href=\u0022\/content-management\u0022\u003ECMS\u003C\/a\u003E like Drupal: There are thousands of community-contributed modules. \u00a0If you want a feature that\u0027s not built in, odds are someone has already written a module that does just that.\u003C\/p\u003E\u003Cp\u003EIn this case, the Follow module is excellent, but it has a limited list of networks that it supports, and that list doesn\u0027t include Yelp or Google+. \u00a0So \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022 target=\u0022_blank\u0022\u003EI wrote a patch\u003C\/a\u003E. \u00a0The main new feature is the ability to create your own custom network links. \u00a0The patch hasn\u0027t been committed yet, but I\u0027ve already applied it to this website; you can see it in the lower right corner, right below this post.\u003C\/p\u003E\u003Cp\u003EThis is exactly how the open source community is supposed to work: people receive, and people give back. \u00a0The community as a whole benefits. \u00a0If there wasn\u0027t an open source CMS available for me to use, it would cost me untold thousands of dollars in time and effort to create my own, or purchase an expensive proprietary solution. \u00a0(Closed-source CMS\u0027s do exist, although for the life of me I can\u0027t figure out why anyone uses them.) \u00a0I have received the benefit of tens of thousands of dollars\u0027 worth of labor from other people, and I received it for free. \u00a0In return, I\u0027m offering a feature that has been requested by dozens of people. \u00a0Now they don\u0027t have to waste their own time and effort developing this feature, and they don\u0027t have to pay for it either. \u00a0Is this the new hippie paradigm? \u00a0Maybe. \u00a0But open source is a multimillion dollar industry now; this ain\u0027t 1969.\u003C\/p\u003E\u003Cp\u003EBottom line: If I can patch a module, I can create a module from scratch. \u00a0This opens up major possibilities for web design and development using Drupal. \u00a0If you need advanced Drupal design with custom modules, \u003Ca href=\u0022\/contact\u0022\u003Elet\u0027s talk\u003C\/a\u003E.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EI have submitted my first patch for a Drupal module. \u0026nbsp;It \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022 target=\u0022_blank\u0022\u003Eadds a major new feature\u003C\/a\u003E to the Follow module.\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EQuick explanation\u003C\/em\u003E: You know how every site has links to Facebook now? \u0026nbsp;And LinkedIn, and Twitter, etc. \u0026nbsp;It\u0027s important to integrate your site with the popular \u003Ca href=\u0022\/social-networking\u0022\u003Esocial networks\u003C\/a\u003E. \u0026nbsp;But on site after site, I found myself hand-rolling blocks of content to display these links. \u0026nbsp;A famous mathematician said,\u0026nbsp;\u201cCivilization advances by extending the number of important operations which we can perform without thinking about them.\u201d \u0026nbsp;Is there an easier way to add social networking links? \u0026nbsp;Of course there is: the Follow module.\u003C\/p\u003E\n\u003Cp\u003EThis is the beauty of an open-source \u003Ca href=\u0022\/content-management\u0022\u003ECMS\u003C\/a\u003E like Drupal: There are thousands of community-contributed modules. \u0026nbsp;If you want a feature that\u0027s not built in, odds are someone has already written a module that does just that.\u003C\/p\u003E\n\u003Cp\u003EIn this case, the Follow module is excellent, but it has a limited list of networks that it supports, and that list doesn\u0027t include Yelp or Google+. \u0026nbsp;So \u003Ca href=\u0022https:\/\/www.drupal.org\/node\/640084\u0022 target=\u0022_blank\u0022\u003EI wrote a patch\u003C\/a\u003E. \u0026nbsp;The main new feature is the ability to create your own custom network links. \u0026nbsp;The patch hasn\u0027t been committed yet, but I\u0027ve already applied it to this website; you can see it in the lower right corner, right below this post.\u003C\/p\u003E\n\u003Cp\u003EThis is exactly how the open source community is supposed to work: people receive, and people give back. \u0026nbsp;The community as a whole benefits. \u0026nbsp;If there wasn\u0027t an open source CMS available for me to use, it would cost me untold thousands of dollars in time and effort to create my own, or purchase an expensive proprietary solution. \u0026nbsp;(Closed-source CMS\u0027s do exist, although for the life of me I can\u0027t figure out why anyone uses them.) \u0026nbsp;I have received the benefit of tens of thousands of dollars\u0027 worth of labor from other people, and I received it for free. \u0026nbsp;In return, I\u0027m offering a feature that has been requested by dozens of people. \u0026nbsp;Now they don\u0027t have to waste their own time and effort developing this feature, and they don\u0027t have to pay for it either. \u0026nbsp;Is this the new hippie paradigm? \u0026nbsp;Maybe. \u0026nbsp;But open source is a multimillion dollar industry now; this ain\u0027t 1969.\u003C\/p\u003E\n\u003Cp\u003EBottom line: If I can patch a module, I can create a module from scratch. \u0026nbsp;This opens up major possibilities for web design and development using Drupal. \u0026nbsp;If you need advanced Drupal design with custom modules, \u003Ca href=\u0022\/contact\u0022\u003Elet\u0027s talk\u003C\/a\u003E.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":53}],"uuid":[{"value":"a40187bc-23a6-4cbf-b969-97f5f9105270"}],"vid":[{"value":382}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2023-03-02T10:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Custom Drupal Modules"}],"created":[{"value":"2011-09-28T16:32:59+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2023-03-02T10:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/custom-drupal-modules","pid":87,"langcode":"und"}],"body":[{"value":"\u003Cp\u003EBeing a web designer means there\u0027s always something more to learn. \u00a0Today\u0027s task:\u00a0\u003Cstrong\u003Ecustom Drupal modules\u003C\/strong\u003E. \u00a0\u003C\/p\u003E\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\u003Cp\u003EDrupal is a \u003Ca href=\u0022\/content-management\u0022\u003Econtent management system\u003C\/a\u003E that\u0027s powerful because you can add\u00a0\u003Cstrong\u003Emodules\u003C\/strong\u003E with added functionality. \u00a0Drupal is\u00a0\u003Cstrong\u003Eopen source\u003C\/strong\u003E which means anyone can write a module, and the community has already supplied thousands. \u00a0If you need to do something fancy on your site, odds are there\u0027s already a module for it. \u00a0But if there isn\u0027t, you can make your own.\u003C\/p\u003E\u003Cp\u003EOf course, this isn\u0027t easy. \u00a0Modules are written in \u003Ca href=\u0022\/web-development\u0022\u003EPHP\u003C\/a\u003E and must use Drupal\u0027s API. \u00a0So, how to get started? \u00a0The best tutorial on the subject I\u0027ve found is from \u003Ca href=\u0022https:\/\/www.geeksandgod.com\/\u0022 target=\u0022_blank\u0022\u003EGeeks \u0026amp; God\u003C\/a\u003E. \u00a0(Totally awesome site, too; shows how\u00a0\u003Cem\u003Eany\u003C\/em\u003E organization can make good use of Drupal.)\u003C\/p\u003E\u003Cp\u003EI intend to release my first contributed module soon; stay tuned.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003EBeing a web designer means there\u0027s always something more to learn. \u0026nbsp;Today\u0027s task:\u0026nbsp;\u003Cstrong\u003Ecustom Drupal modules\u003C\/strong\u003E. \u0026nbsp;\u003C\/p\u003E\n\u003Cp\u003E\u003C!--break--\u003E\u003C\/p\u003E\n\u003Cp\u003EDrupal is a \u003Ca href=\u0022\/content-management\u0022\u003Econtent management system\u003C\/a\u003E that\u0027s powerful because you can add\u0026nbsp;\u003Cstrong\u003Emodules\u003C\/strong\u003E with added functionality. \u0026nbsp;Drupal is\u0026nbsp;\u003Cstrong\u003Eopen source\u003C\/strong\u003E which means anyone can write a module, and the community has already supplied thousands. \u0026nbsp;If you need to do something fancy on your site, odds are there\u0027s already a module for it. \u0026nbsp;But if there isn\u0027t, you can make your own.\u003C\/p\u003E\n\u003Cp\u003EOf course, this isn\u0027t easy. \u0026nbsp;Modules are written in \u003Ca href=\u0022\/web-development\u0022\u003EPHP\u003C\/a\u003E and must use Drupal\u0027s API. \u0026nbsp;So, how to get started? \u0026nbsp;The best tutorial on the subject I\u0027ve found is from \u003Ca href=\u0022https:\/\/www.geeksandgod.com\/\u0022 target=\u0022_blank\u0022\u003EGeeks \u0026amp; God\u003C\/a\u003E. \u0026nbsp;(Totally awesome site, too; shows how\u0026nbsp;\u003Cem\u003Eany\u003C\/em\u003E organization can make good use of Drupal.)\u003C\/p\u003E\n\u003Cp\u003EI intend to release my first contributed module soon; stay tuned.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":52}],"uuid":[{"value":"7fdc9bf1-9db0-4ab9-88ee-9a0fe50eaf0b"}],"vid":[{"value":205}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Now I\u0027m on Yelp!"}],"created":[{"value":"2011-09-25T06:40:26+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2018-09-17T21:00:01+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/now-im-yelp","pid":86,"langcode":"und"}],"body":[{"value":"\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.yelp.com\/biz\/tenuki-design-san-francisco\u0022 target=\u0022_blank\u0022\u003E\u003Cimg alt=\u0022\u0022 src=\u0022\/sites\/default\/files\/4209428724_984e160e20_m.jpg\u0022 style=\u0022width: 240px; height: 54px; \u0022 \/\u003E\u003C\/a\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cem\u003E(Even though it violates my rule of \u003Ca href=\u0022\/who-am-i\u0022\u003Ealways using the first person\u003C\/a\u003E)\u003C\/em\u003E\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.yelp.com\/biz\/tenuki-design-san-francisco\u0022 target=\u0022_blank\u0022\u003E\u003Cimg alt src=\u0022\/sites\/default\/files\/4209428724_984e160e20_m.jpg\u0022 style=\u0022width: 240px; height: 54px; \u0022\u003E\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003E(Even though it violates my rule of \u003Ca href=\u0022\/who-am-i\u0022\u003Ealways using the first person\u003C\/a\u003E)\u003C\/em\u003E\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":51}],"uuid":[{"value":"d5b5fdef-6b02-4e84-ba97-8a2200d7a15e"}],"vid":[{"value":51}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":"Mobile site is up"}],"created":[{"value":"2011-09-24T23:11:23+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/mobile-site","pid":85,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ETenuki has a mobile site now! \u0026nbsp;Just visit \u003Ca href=\u0022http:\/\/tenukidesign.com\u0022\u003Etenukidesign.com\u003C\/a\u003E from any mobile device and it should appear automatically. \u0026nbsp;I can now brag that Tenuki does\u0026nbsp;\u003Cstrong\u003Emobile web design\u003C\/strong\u003E.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ETenuki has a mobile site now! \u0026nbsp;Just visit \u003Ca href=\u0022http:\/\/tenukidesign.com\u0022\u003Etenukidesign.com\u003C\/a\u003E from any mobile device and it should appear automatically. \u0026nbsp;I can now brag that Tenuki does\u0026nbsp;\u003Cstrong\u003Emobile web design\u003C\/strong\u003E.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]},{"nid":[{"value":50}],"uuid":[{"value":"0aecb656-76ee-485a-b48f-e3b1662092d4"}],"vid":[{"value":50}],"langcode":[{"value":"und"}],"type":[{"target_id":"article","target_type":"node_type","target_uuid":"b6674995-976c-4c14-8643-e8635aaf0af9"}],"revision_timestamp":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"revision_uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"status":[{"value":true}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"2b4c4fd3-b3d9-4b63-aad8-ffde0de19673","url":"\/users\/jordan"}],"title":[{"value":". . . and we\u0027re live"}],"created":[{"value":"2011-09-23T06:46:21+00:00","format":"Y-m-d\\TH:i:sP"}],"changed":[{"value":"2014-08-03T02:16:48+00:00","format":"Y-m-d\\TH:i:sP"}],"promote":[{"value":true}],"sticky":[{"value":false}],"default_langcode":[{"value":true}],"revision_translation_affected":[{"value":true}],"path":[{"alias":"\/content\/and-were-live","pid":84,"langcode":"und"}],"body":[{"value":"\u003Cp\u003ENot \u0022we,\u0022 really; me. \u0026nbsp;I \u003Ca href=\u0022\/who-am-i\u0022\u003Ealready promised\u003C\/a\u003E I wouldn\u0027t refer to myself as \u0022we\u0022 in an effort to make the company sound bigger than it is.\u003C\/p\u003E\u003Cp\u003ESo, what\u0027s going on? \u0026nbsp;I\u0027ve formed a new web design firm, called Tenuki Design. \u0026nbsp;Tenuki is \u003Ca href=\u0022\/what-tenuki\u0022\u003Ea term from Go\u003C\/a\u003E (think Japanese chess), which means \u0022do something different.\u0022 \u0026nbsp;In this case, I\u0027m challenging my clients to do something different. \u0026nbsp;If your business isn\u0027t where you want it to be, then clearly something has to change. \u0026nbsp;But even if your business is successful, there\u0027s always more space on the board.\u003C\/p\u003E\u003Cp\u003EWhy this, why now? \u0026nbsp;I\u0027m doing this for \u003Ca href=\u0022http:\/\/koplowicz.com\/node\/732\u0022 target=\u0022_blank\u0022\u003Ea lot of reasons\u003C\/a\u003E, but mostly because \u003Ca href=\u0022\/who-am-i\u0022\u003Eit\u0027s my passion\u003C\/a\u003E. \u0026nbsp;I spent four years as an attorney and that was enough.\u003C\/p\u003E\u003Cp\u003EWhat can I do? \u0026nbsp;\u003Ca href=\u0022\/services\u0022\u003ELots of things\u003C\/a\u003E, but I focus on \u003Ca href=\u0022\/content-management\u0022\u003Econtent management systems\u003C\/a\u003E running Drupal.\u003C\/p\u003E\u003Cp\u003ESo, I\u0027m open for business. \u0026nbsp;Do you need a new website? \u0026nbsp;\u003Ca href=\u0022\/contact\u0022\u003EContact me\u003C\/a\u003E. \u0026nbsp;I\u0027ll also be grateful for referrals.\u003C\/p\u003E","format":"full_html","processed":"\u003Cp\u003ENot \u0022we,\u0022 really; me. \u0026nbsp;I \u003Ca href=\u0022\/who-am-i\u0022\u003Ealready promised\u003C\/a\u003E I wouldn\u0027t refer to myself as \u0022we\u0022 in an effort to make the company sound bigger than it is.\u003C\/p\u003E\n\u003Cp\u003ESo, what\u0027s going on? \u0026nbsp;I\u0027ve formed a new web design firm, called Tenuki Design. \u0026nbsp;Tenuki is \u003Ca href=\u0022\/what-tenuki\u0022\u003Ea term from Go\u003C\/a\u003E (think Japanese chess), which means \u0022do something different.\u0022 \u0026nbsp;In this case, I\u0027m challenging my clients to do something different. \u0026nbsp;If your business isn\u0027t where you want it to be, then clearly something has to change. \u0026nbsp;But even if your business is successful, there\u0027s always more space on the board.\u003C\/p\u003E\n\u003Cp\u003EWhy this, why now? \u0026nbsp;I\u0027m doing this for \u003Ca href=\u0022http:\/\/koplowicz.com\/node\/732\u0022 target=\u0022_blank\u0022\u003Ea lot of reasons\u003C\/a\u003E, but mostly because \u003Ca href=\u0022\/who-am-i\u0022\u003Eit\u0027s my passion\u003C\/a\u003E. \u0026nbsp;I spent four years as an attorney and that was enough.\u003C\/p\u003E\n\u003Cp\u003EWhat can I do? \u0026nbsp;\u003Ca href=\u0022\/services\u0022\u003ELots of things\u003C\/a\u003E, but I focus on \u003Ca href=\u0022\/content-management\u0022\u003Econtent management systems\u003C\/a\u003E running Drupal.\u003C\/p\u003E\n\u003Cp\u003ESo, I\u0027m open for business. \u0026nbsp;Do you need a new website? \u0026nbsp;\u003Ca href=\u0022\/contact\u0022\u003EContact me\u003C\/a\u003E. \u0026nbsp;I\u0027ll also be grateful for referrals.\u003C\/p\u003E\n","summary":null}],"comment":[{"status":2,"cid":0,"last_comment_timestamp":1407032208,"last_comment_name":null,"last_comment_uid":1,"comment_count":0}],"field_image":[],"field_tags":[]}]