class: center, middle ## Community Call
#### Zoom room https://zoom.us/j/655391807 #### 3/4 July 2019
@stencila
Press
P
to switch to presenter mode
--- ### Agenda - **Ben Shaw:** Logga a new package for logging 🌲 - **Alex Ketch:** Improving start-up performance in Encoda 🚗💨 - **Jacqueline Wijaya:** Hub redesign updates 🎨 - **Nokome Bentley:** Encoda and Thema progress and roadmap 📝 --- class: center, middle ## Ben --- ## Logga 🌲 #### Emit log events from anywhere. Consistently. - We needed a way to solve the "Logging from a library" problem. - Other logging libraries exist (e.g Winston and Pino) but they are for the output of log messages rather than just generation. - Inspired by Python Logging Library and Java's Log4J. - A logger can be created and logged to with impunity, it acts a sink until a handler is set up to output the log messages somewhere. - It uses events through NodeJS's global `process` object so the library and application code are completely decoupled. --- Logga has a default handler that formats log data for human consumption on TTY devices  --- ... and as [ndjson](http://ndjson.org/) for machine consumption on non-TTY devices e.g log files ```json {"time":"2019-07-02T21:19:24.872Z","tag":"example","level":3,"message":"This is line five.","stack":"Error\n at Object.
(/home/nokome/stencila/source/logga/example.js:21:5)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)"} {"time":"2019-07-02T21:19:24.875Z","tag":"example","level":2,"message":"Everything is just fine.","stack":"Error\n at Object.
(/home/nokome/stencila/source/logga/example.js:22:5)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)"} {"time":"2019-07-02T21:19:24.875Z","tag":"example","level":1,"message":"Oh, oh, not no much.","stack":"Error\n at Object.
(/home/nokome/stencila/source/logga/example.js:23:5)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)"} {"time":"2019-07-02T21:19:24.875Z","tag":"example","level":0,"message":"Aaargh, an error!","stack":"Error\n at Object.
(/home/nokome/stencila/source/logga/example.js:24:5)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)"} {"time":"2019-07-02T21:19:24.875Z","tag":"example","level":0,"message":"Woaaah something bad happened! I am an error object.","stack":"Error: I am an error object.\n at Object.
(/home/nokome/stencila/source/logga/example.js:27:9)\n at Module._compile (internal/modules/cjs/loader.js:689:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)\n at Module.load (internal/modules/cjs/loader.js:599:32)\n at tryModuleLoad (internal/modules/cjs/loader.js:538:12)\n at Function.Module._load (internal/modules/cjs/loader.js:530:3)\n at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)\n at startup (internal/bootstrap/node.js:266:19)\n at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)"} ``` --- Logga can be used with a log handling library e.g. Winston Pino. ```javascript // In library, create a named logger const logger = getLogger('encoda') ``` ```javascript // Handle the log messages in application code addHandler((data: LogData) => { // Send off to log output function winstonLogger.log(LogLevel[data.level], data.message); // or filter on tag if (data.tag === 'encoda') { // do something different } }) ``` --- class: center, middle ## Alex --- class: center, middle ## Jacqueline --- class: center, middle ### Original Hub  --- class: center, middle ### Redesigned Hub  --- class: center, middle ## Nokome --- class: center, middle #### https://github.com/stencila/encoda  --- ### `dar`: a codec for eLife document archives - Currently only `encode` function implemented - Encodes `Collection`, `Article` or `Datatable` node types - Encodes `Article`s as JATS XML (using `jats` codec) - Encodes `Datatable`s as CSV (using `csv` codec) A simple RMarkdown project ```bash $ tree rmd-project rmd-project ├── Portal_rodent_species.csv └── rodents.Rmd ``` Let's convert it to DAR ```bash $ encoda convert rmd-project rmd-project.dar ``` --- #### `rmd-project.dar` ```bash $ tree rmd-project.dar rmd-project.dar ├── d0-a0-33c775a76283b0bcfc86329b0e21f19b.csv ├── d1.jats.xml └── manifest.xml ``` #### `manifest.xml` ```xml <dar> <documents> <document type="article" id="d1" path="d1.jats.xml"></document> </documents> <assets> <asset id="d0-a0" type="text/csv" path="d0-a0-33c775a76283b0bcfc86329b0e21f19b.csv" sync="true"></asset> </assets> </dar> ``` --- ### `dir`: a codec for directories - Decodes a directory to a (nested) `Collection` of `CreativeWork` nodes - Encodes a collection to a (nested) directory of files (defaults to `.html`) - Useful for publishing projects as HTML - In process of using it for publishing Encoda's docs on Github - Pattern for 'main' file can be specified e.g. `main.*`, `index.*`, `README.*` e.g. ``` -── top ├── a │ ├── index.md -> index.html ├── b │ ├── README.ipynb -> index.html └── c └── main.docx -> index.html ``` --- class: center, middle #### https://github.com/stencila/thema  --- class: center, middle  --- class: center, middle ### Help wanted! 📬 Sign up to [become a Stencila Hub Beta Tester](https://forms.gle/s1zbDL3fEdcyW5Zf6) Send us ideas 🤔, examples 💡, bug reports 🐛, documentation 📖, code 💻, questions 💬 on any of our Github repos https://github.com/stencila