{"data":{"post":{"title":"Use crontab to Automate Updates of CLI Softwares","subtitle":"","isPublished":true,"createdTime":"2019-03-24T00:00:00.000Z","lastModifiedTime":null,"license":null,"tags":["UNIX","crontab","Automation"],"category":"Productivity","file":{"childMdx":{"excerpt":"crontab , an abbreviation of chronic table (periodical time table), is\na task scheduler which…","code":{"body":"function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nconst layoutProps = {};\nreturn class MDXContent extends React.Component {\n  constructor(props) {\n    super(props);\n    this.layout = null;\n  }\n\n  render() {\n    const _this$props = this.props,\n          {\n      components\n    } = _this$props,\n          props = _objectWithoutProperties(_this$props, [\"components\"]);\n\n    return React.createElement(MDXTag, {\n      name: \"wrapper\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `crontab`), `, an abbreviation of chronic table (periodical time table), is\na task scheduler which schedules tasks in period of time on UNIX systems.\nEach user in UNIX systems have its own \"crontab\".`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Editing the crontab File`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `By executing `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `crontab -e`), `, you can open the crontab of the user you logged\nin. The following figure shows the contents of my crontab.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/6191de13f70b35f6b82ed4c1af605fc4/cd3ae/crontab-e%402x.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/6191de13f70b35f6b82ed4c1af605fc4/0cc25/crontab-e%402x.png\",\n        \"srcSet\": [\"/static/6191de13f70b35f6b82ed4c1af605fc4/5116e/crontab-e%402x.png 178w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/92f55/crontab-e%402x.png 356w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/0cc25/crontab-e%402x.png 712w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/7ae06/crontab-e%402x.png 1068w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/eee47/crontab-e%402x.png 1424w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/72a5c/crontab-e%402x.png 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/6191de13f70b35f6b82ed4c1af605fc4/690c8/crontab-e%402x.webp\",\n        \"srcSet\": [\"/static/6191de13f70b35f6b82ed4c1af605fc4/25c8a/crontab-e%402x.webp 178w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/60698/crontab-e%402x.webp 356w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/690c8/crontab-e%402x.webp 712w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/d7e52/crontab-e%402x.webp 1068w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/456ef/crontab-e%402x.webp 1424w\", \"/static/6191de13f70b35f6b82ed4c1af605fc4/cd3ae/crontab-e%402x.webp 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/6191de13f70b35f6b82ed4c1af605fc4/cd3ae/crontab-e%402x.webp\",\n        \"alt\": \"Editor of crontab\",\n        \"title\": \"Editor of crontab\",\n        \"width\": 712,\n        \"height\": 512,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            Editor of crontab\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `As you can see, I'm using crontab to automate the updates of `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `home brew`), `,\n`, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `npm`), ` and `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `arcanist`), ` (Arcanist is a CLI code review tool as a part of\nthe code review, project planning and hosting suite: Phabricator).`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `The left side sequences of numbers like `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `0 0 * * *`), ` means \"00:00 AM each\nday\", and sets the execution time of the right side command. You can have\na user-friendly tuning interface for this sequence of numbers at\n`, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"p\",\n      props: {\n        \"href\": \"https://crontab.guru\"\n      }\n    }, `crontab.guru`), `.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `The right side commands only supports several environment variables. You\ncan imagine a shell environment without any `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `*rc`), ` file loaded, that is\nwhat a crontab command gets.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Since a command executed by crontab gets such kind of shell environment,\neven the `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `PATH`), ` environment variable is not set yet, and you have to write\ndown the full path of a command.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `A command executed by crontab can be a CLI command comes with the UNXI\nsystem or a user script programmed by yourself. If you are executing a\nsystem command which requires root privilege, you have to ensure the\ncommand you are executing is listed in your sudoers file. If you are\nexecuting a shell script in a crontab, you have to use\n`, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `chmod +x your_script_name`), ` to make your script executable.`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Saving the crontab File`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Saving your crontab file is different on different editors. In VIM, you\ncan save with `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `:w⏎`), `。 If you are using macOS, you may get a following\ndialog after saving your crontab file and you have to click \"OK\" to allow\nthe system accept your editing.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/020cd4f78515eb564a46f51572c8f625/7d421/macos-alert%402x.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/020cd4f78515eb564a46f51572c8f625/0cc25/macos-alert%402x.png\",\n        \"srcSet\": [\"/static/020cd4f78515eb564a46f51572c8f625/5116e/macos-alert%402x.png 178w\", \"/static/020cd4f78515eb564a46f51572c8f625/92f55/macos-alert%402x.png 356w\", \"/static/020cd4f78515eb564a46f51572c8f625/0cc25/macos-alert%402x.png 712w\", \"/static/020cd4f78515eb564a46f51572c8f625/76400/macos-alert%402x.png 1064w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/020cd4f78515eb564a46f51572c8f625/690c8/macos-alert%402x.webp\",\n        \"srcSet\": [\"/static/020cd4f78515eb564a46f51572c8f625/25c8a/macos-alert%402x.webp 178w\", \"/static/020cd4f78515eb564a46f51572c8f625/60698/macos-alert%402x.webp 356w\", \"/static/020cd4f78515eb564a46f51572c8f625/690c8/macos-alert%402x.webp 712w\", \"/static/020cd4f78515eb564a46f51572c8f625/7d421/macos-alert%402x.webp 1064w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/020cd4f78515eb564a46f51572c8f625/7d421/macos-alert%402x.webp\",\n        \"alt\": \"macOS Alert\",\n        \"title\": \"macOS Alert\",\n        \"width\": 712,\n        \"height\": 359,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            macOS Alert\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Notification Mails`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Each time a command executed by crontab, you would get a mail. You can\ncheck this mail in command line. You can use `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `mail`), ` command to read these\nmails.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/e47fd61f7cef485832f64c44f751fde5/cd3ae/crontab-mails%402x.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/e47fd61f7cef485832f64c44f751fde5/0cc25/crontab-mails%402x.png\",\n        \"srcSet\": [\"/static/e47fd61f7cef485832f64c44f751fde5/5116e/crontab-mails%402x.png 178w\", \"/static/e47fd61f7cef485832f64c44f751fde5/92f55/crontab-mails%402x.png 356w\", \"/static/e47fd61f7cef485832f64c44f751fde5/0cc25/crontab-mails%402x.png 712w\", \"/static/e47fd61f7cef485832f64c44f751fde5/7ae06/crontab-mails%402x.png 1068w\", \"/static/e47fd61f7cef485832f64c44f751fde5/eee47/crontab-mails%402x.png 1424w\", \"/static/e47fd61f7cef485832f64c44f751fde5/72a5c/crontab-mails%402x.png 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/e47fd61f7cef485832f64c44f751fde5/690c8/crontab-mails%402x.webp\",\n        \"srcSet\": [\"/static/e47fd61f7cef485832f64c44f751fde5/25c8a/crontab-mails%402x.webp 178w\", \"/static/e47fd61f7cef485832f64c44f751fde5/60698/crontab-mails%402x.webp 356w\", \"/static/e47fd61f7cef485832f64c44f751fde5/690c8/crontab-mails%402x.webp 712w\", \"/static/e47fd61f7cef485832f64c44f751fde5/d7e52/crontab-mails%402x.webp 1068w\", \"/static/e47fd61f7cef485832f64c44f751fde5/456ef/crontab-mails%402x.webp 1424w\", \"/static/e47fd61f7cef485832f64c44f751fde5/cd3ae/crontab-mails%402x.webp 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/e47fd61f7cef485832f64c44f751fde5/cd3ae/crontab-mails%402x.webp\",\n        \"alt\": \"crontab mails\",\n        \"title\": \"crontab Mails\",\n        \"width\": 712,\n        \"height\": 512,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            crontab Mails\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Then each day you come to your desktop, just open your command line\nterminal, and type `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `mail`), `, then you can know which CLI softwares were\nupdated. As you can see, the `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `npm`), ` on my computer was updated today.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/54dc247ca384236b05ea28f814dc1a71/cd3ae/crontab-mails-contents%402x.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/54dc247ca384236b05ea28f814dc1a71/0cc25/crontab-mails-contents%402x.png\",\n        \"srcSet\": [\"/static/54dc247ca384236b05ea28f814dc1a71/5116e/crontab-mails-contents%402x.png 178w\", \"/static/54dc247ca384236b05ea28f814dc1a71/92f55/crontab-mails-contents%402x.png 356w\", \"/static/54dc247ca384236b05ea28f814dc1a71/0cc25/crontab-mails-contents%402x.png 712w\", \"/static/54dc247ca384236b05ea28f814dc1a71/7ae06/crontab-mails-contents%402x.png 1068w\", \"/static/54dc247ca384236b05ea28f814dc1a71/eee47/crontab-mails-contents%402x.png 1424w\", \"/static/54dc247ca384236b05ea28f814dc1a71/72a5c/crontab-mails-contents%402x.png 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/54dc247ca384236b05ea28f814dc1a71/690c8/crontab-mails-contents%402x.webp\",\n        \"srcSet\": [\"/static/54dc247ca384236b05ea28f814dc1a71/25c8a/crontab-mails-contents%402x.webp 178w\", \"/static/54dc247ca384236b05ea28f814dc1a71/60698/crontab-mails-contents%402x.webp 356w\", \"/static/54dc247ca384236b05ea28f814dc1a71/690c8/crontab-mails-contents%402x.webp 712w\", \"/static/54dc247ca384236b05ea28f814dc1a71/d7e52/crontab-mails-contents%402x.webp 1068w\", \"/static/54dc247ca384236b05ea28f814dc1a71/456ef/crontab-mails-contents%402x.webp 1424w\", \"/static/54dc247ca384236b05ea28f814dc1a71/cd3ae/crontab-mails-contents%402x.webp 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/54dc247ca384236b05ea28f814dc1a71/cd3ae/crontab-mails-contents%402x.webp\",\n        \"alt\": \"crontab Mails Contents\",\n        \"title\": \"crontab Mails Contents\",\n        \"width\": 712,\n        \"height\": 512,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            crontab Mails Contents\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Changing Notification Mails Destination`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `By default, each command executed by crontab sends a mail to the user who\nsets the command up. But you can change the destination address by adding\nthe following line on the top of the crontab file (open crontab file by\ntyping `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `crontab -e`), `).`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-crontab\"\n      }\n    }, `MAILTO=your@emailaddress.com\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `You can also disable the mail notifications by setting `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `MAILTO`), ` to `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `\"\"`), `,\nwhich like the following code shows:`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-crontab\"\n      }\n    }, `MAILTO=\"\"\n`)), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Reading the Manual of crontab`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `By executing `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `man crontab`), `, you can see details of the usages of crontab.`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/b464c6fa17b247146319c60cf3d8c2b4/cd3ae/ctontab-man%402x.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/b464c6fa17b247146319c60cf3d8c2b4/0cc25/ctontab-man%402x.png\",\n        \"srcSet\": [\"/static/b464c6fa17b247146319c60cf3d8c2b4/5116e/ctontab-man%402x.png 178w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/92f55/ctontab-man%402x.png 356w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/0cc25/ctontab-man%402x.png 712w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/7ae06/ctontab-man%402x.png 1068w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/eee47/ctontab-man%402x.png 1424w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/72a5c/ctontab-man%402x.png 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/b464c6fa17b247146319c60cf3d8c2b4/690c8/ctontab-man%402x.webp\",\n        \"srcSet\": [\"/static/b464c6fa17b247146319c60cf3d8c2b4/25c8a/ctontab-man%402x.webp 178w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/60698/ctontab-man%402x.webp 356w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/690c8/ctontab-man%402x.webp 712w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/d7e52/ctontab-man%402x.webp 1068w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/456ef/ctontab-man%402x.webp 1424w\", \"/static/b464c6fa17b247146319c60cf3d8c2b4/cd3ae/ctontab-man%402x.webp 1524w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/b464c6fa17b247146319c60cf3d8c2b4/cd3ae/ctontab-man%402x.webp\",\n        \"alt\": \"Manual of crontab\",\n        \"title\": \"Manual of crontab\",\n        \"width\": 712,\n        \"height\": 512,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            Manual of crontab\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Some Resources`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `My crontab scripts for macOS: `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"p\",\n      props: {\n        \"href\": \"https://github.com/WeZZard/com.wezzard.crontab.macos\"\n      }\n    }, `WeZZard/com.wezzard.crontab.macos`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `My crontab scripts for developing: `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"p\",\n      props: {\n        \"href\": \"https://github.com/WeZZard/com.wezzard.crontab.dev\"\n      }\n    }, `WeZZard/com.wezzard.crontab.dev`)));\n  }\n\n}\nMDXContent.isMDXComponent = true;","scope":""},"headings":[{"value":"Editing the crontab File","depth":2},{"value":"Saving the crontab File","depth":2},{"value":"Notification Mails","depth":2},{"value":"Changing Notification Mails Destination","depth":2},{"value":"Reading the Manual of crontab","depth":2},{"value":"Some Resources","depth":2}]}}},"earlierPostExcerpt":{"slug":"/post/2019/03/notes-on-implementation-of-gatsblog-fef0","title":"Notes On Implementation of Gatsblog","subtitle":"","createdTime":"2019-03-04T00:00:00.000Z","tags":["Blog","Programming","Gatsblog"],"category":"Showcase","file":{"childMdx":{"excerpt":"This post has been revisited with LLM technology to improve its English\nfluency. In this post, I'll discuss the implementation of Gatsblog, a blog system\nbuilt with Gatsby.js. If you missed my previous posts about the overview and\ndesign of Gatsblog, please check them for context about the…"}}},"laterPostExcerpt":{"slug":"/post/2019/03/a-glimpse-into-generic-meta-programming-in-swift-d2cd","title":"A Glimpse into Swift Generic Meta-Programming","subtitle":"Make VFL Reborn in Swift with Compile-Time Safety","createdTime":"2019-03-27T00:00:00.000Z","tags":["Swift","MetaProgramming","Generic","VFL","AutoLayout","macOS","iOS","tvOS"],"category":"Programming","file":{"childMdx":{"excerpt":"Preface What is the most critical thing swings your decision when you choose a\nprogramming language? Some people may say, the less lines of code they write, the better the\nlanguage itself is. (Nope, the best programming language is PHP.) OK. It might be true. But writing less code is not an…"}}}},"pageContext":{"postId":"134e5703-f8d8-5c94-b7f7-fbe98b44876e","earlierPostId":"b0391bd1-0091-590a-80f2-6b6cb0632e4d","laterPostId":"ce1c7301-5889-59f8-821a-d4832b9a64b6"}}