AI prompts
base on 📝 We write about our technologies and the problems we handle at scale. Grab Engineering Blog
===========
Welcome to Grab's official engineering blog where we share the good engineering practices in Grab and the things we engineers do that can benefit other engineers in the industry. Comments and feedback are welcome!
### Getting Started
The blog runs on [Jekyll](https://jekyllrb.com), an awesome static site builder that is written in Ruby. To get started, clone the repository and run the following steps:
```sh
$ gem install bundler
$ bundle install
$ bundle exec jekyll serve
```
Navigate to `http://localhost:4000` to view the blog. A process runs in the background to watch for changes made to the code. Simply refresh the page to see the updated changes. If you are new to Jekyll, we would recommend that you check out their detailed documentation [here](https://jekyllrb.com/docs/home/).
### Contributing
Interested in writing a blog entry to the blog? Simply fork the repository and make a pull request with the new entry, a markdown file in the `_posts` folder with the name `YYYY-MM-DD-your-title.md`.
#### Adding Authors
If you are a new author, add your bio to `_data/authors.yml`, for example:
```yml
lian-yuanlin: # This is the ID of the author
name: Lian Yuanlin
thumbnail: /img/authors/lian-yuanlin.jpg # Use a remote image or add your own image
github: alienchow # GitHub Username (optional)
```
#### Writing your post
Each post should have the following front matter defined:
|Property|Explanation|Example
|:---|:---|:---|
|`layout`|The layout template from the `_layouts` directory. We only have `post` for now.|`post`|
|`id`|Unique id for each blog entry. This is used by Disqus to uniquely identify posts and should not be modified if a Disqus thread for that post already exists.|`curious-case-of-the-phantom-instance`|
|`title`|Title of blog entry|`The Curious Case of The Phantom Instance`|
|`date`|Date of entry in `DDDD-MM-YY HH:MM:SS` format|`2015-12-28 04:39:00`. Note that this is in UTC and posts in the future will not be displayed. To such posts during development, use `bundle exec jekyll serve --future` |
|`authors`|YAML list of author IDs. The author bio will be retrieved from `_data/authors.yml` and displayed within the post.|`[lian-yuanlin, ...]`|
|`categories`|YAML list of categories, sorted alphabetically. Only use existing categories in `_data/categories.yml`.|`[Engineering]`|
|`tags`|YAML list of tags, sorted alphabetically. Please check existing tags on `/tags` and reuse where possible.|`[AWS, Golang]`|
|`cover_photo`|Relative URL to the FB open graph image (ideally 820x312)|`/img/grab-vietnam-careers-week/son-hai.jpg`|
|`comments`|Whether to display Disqus comments box. Why would you set this to `false`?|`true`|
|`excerpt`|Your catchy excerpt that will be shown on the list of blog entries page. Wrap your excerpt in quotes if it spans across multiple lines.|`"Here at the Grab Engineering team, we have built our entire backend stack on top of Amazon Web Services (AWS). Over time, it was inevitable that some habits have started to form when perceiving our backend monitoring statistics."`|
Proceed to write your blog entry in [GitHub-flavoured Markdown](https://help.github.com/articles/basic-writing-and-formatting-syntax/) format. Should you want to add images to your blog entry, the files should be added to the `img/<post-id>` folder.
When you are done with your entry, simply make a pull request and ping us in the `#eng-bloggers` Slack channel to request for a review!
That's it, happy blogging!
### Deployment
Since we are using custom plugins (such as for authors), GitHub will not build and deploy the generated site for us. We use a custom gem `jgd` meant for deploying Jekyll pages manually.
```sh
$ jgd
```
This step is automatically carried out on Travis CI, you just need to commit on master to trigger the script. For more details, see the script in `.travis.yml`.
### License
MIT License
", Assign "at most 3 tags" to the expected json: {"id":"11967","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"