teleren/devto huggingface dataset:
One shortcut to rule them all
Tags: editor, code, dx
Published: 2021-01-23 13:41:38

---
title: One shortcut to rule them all
published: true
date: 2021-01-23 13:24:22 UTC
tags: editor,code,dx
canonical_url: https://stereobooster.com/posts/one-shortcut-to-rule-them-all/
cover_image: https://stereobooster.com/posts/one-shortcut-to-rule-them-all/commands_hu9999b8291d8db945ae71c9ec265e2206_139045_600x0_resize_box_2.png
---

or an ode to command palette.

Many editors adopted this idea after Sublime - when you type <kbd>Command</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> (Mac OS)or <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> (Windows, Linux) it will open command palette, where you can easily find all actions (with or without shortcuts). This is very powerful idea - you don't need to remember all shortcuts, you can simply find one. And eventually you will memorize most used ones.

Support across IDEs (or text-editors if you like):

- Sublime: built-in
- VSCode: built-in
- onivim 2: built-in
- Atom: [command-palette](https://github.com/atom/command-palette) plugin
- Vim: [fzf](https://github.com/junegunn/fzf)+[fzf.vim](https://github.com/junegunn/fzf.vim), [CtrlP](https://github.com/dbeecham/ctrlp-commandpalette.vim) (see [API: command "palette": nvim_get_keymap(), etc.](https://github.com/neovim/neovim/issues/6240))
- Emacs: [not sure](https://emacs.stackexchange.com/questions/27628/is-there-sublime-text-style-command-palette-in-emacs)
- Other: [paletro](https://appmakes.io/paletro)
How to Speed-Up the AMI Creation of your EC2 instances
Tags: ami, ec2, aws, snapshot
Published: 2021-01-23 13:20:21

SCENARIO:

You have a legacy application hosted in a single Amazon EC2 instance running in the Production environment. You need to upgrade your systems and the existing instance must be vertically scaled (use a larger instance type). Before proceeding, you must create an AMI of the EC2 instance first before implementing the change.

ISSUE:

Upon testing, you found out that it takes hours for the AMI creation process to complete. This delay will increase the possible downtime of your application and might cause the migration activity to exceed the scheduled change window, affecting the end-users.  

POSSIBLE SOLUTIONS:

Solution #1. Take an EBS snapshot of your EC2 instance before doing the actual migration. Create another snapshot or AMI again right after the first snapshot/AMI has been created.

Solutions #2. Increase the snapshot frequency of your EC2 instance in your Amazon Data Lifecycle Manager

KEY POINT:

- The snapshot process is incremental. This means that only the blocks on the EBS device that have changed after your most recent snapshot are saved.  Thus, future snapshots will take less time



References:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html
https://forums.aws.amazon.com/thread.jspa?threadID=91650
Functional programming with Angular. 0. Introduction
Tags: angular, functional
Published: 2021-01-23 13:12:51


Functional programming is kind of thing which usually is not too famous. You have to come to this one day and will be completely different.
What is this? Long story short, it's method of thinking. Personally me prefer to treat it as a stream when you do not do something, you are converting one items (inputs) to another (results), using some computational logic.
There are not a lot of resources for functional programming in JS at all, so my recommendation will be this link https://medium.com/@cb.yannick/functional-programming-with-typescript-part-1-3f7167a2c0ad

So what about angular? I did not found any good resources for Angular, maybe because with FP it's pretty common to avoid Dependency injection, which is a core and main part of Angular.

So I will try in next articles to show what and how I apply functional programming with Angular.
Calculadora em Python 
Tags: python, programming, beginners
Published: 2021-01-23 13:12:03

Estou apredendo a programar, então se o código abaixo estiver com alguma informação incorreta, por favor deixe a explicação correta nos comentários. Obrigada

```python
while True:  """essa linha irá fazer o comando reiniciar sem que precise ficar abrindo e fechando o programa"""

operacao = input("Qual operação deseja realizar? +, -, *, / \n Para sair precione x")) """pergunta para o usuário qual a        operação que deseja fazer"""

     if operacao == "x" or operacao == "X" """para fechar o programa utilizar o if para validar a informação e o break para fechar o programa, como tem um while ele irá reiniciar o código"""
          break

     elif operacao == "+" or operacao == "-" or operacao == "*" or operacao == "/" """vai validar qual das operações irá realizar e caso não esteja correto irá constar como operação inválida"""

    else: 
        print("Operação invalida!")
      
     num1 = float(intput("Digite o 1° número: " )) """variável para guardar a informação, poderia ser int ou float, sendo que int e um número inteiro (1 - 2 - 3)e float representa um número fracionado (3,55 - 4,75 - 9,63). Input para que o usuário possa inserir a informação"""
     num2 =float(intput("Digite o 1° número: " ))


if operacao == "+" : """ valida se a conta é de soma, se sim irá somar a variável num1 e a num2, senão irá para a próxima e assim por diante """
   total = numb1+numb2
   total """irá retornar o valor total"""

elif operacao == "-" :
   total = numb1-numb2
   total

elif operacao == "*" :
   total = numb1*numb2
   total

elif operacao == "/" :
   total = numb1/numb2
   total
```
Daily Developer Jokes - Saturday, Jan 23, 2021
Tags: jokes, dailydeveloperjokes
Published: 2021-01-23 13:00:29

---
title: "Daily Developer Jokes - Saturday, Jan 23, 2021"
description: "Check out today's daily developer joke! (a project by Fred Adams at xtrp.io)"
series: "Daily Developer Jokes"
cover_image: "https://private.xtrp.io/projects/DailyDeveloperJokes/thumbnail_generator/?date=Saturday%2C%20Jan%2023%2C%202021"
published: true
tags: #jokes, #dailydeveloperjokes
---

Generated by Daily Developer Jokes, a project by [Fred Adams](https://xtrp.io/) ([@xtrp](https://dev.to/xtrp) on DEV)

___Read about Daily Developer Jokes on [this blog post](https://xtrp.io/blog/2020/01/12/daily-jokes-bot-release/), and check out the [Daily Developer Jokes Website](https://dailydeveloperjokes.github.io/).___
### Today's Joke is...
![Joke Image](https://private.xtrp.io/projects/DailyDeveloperJokes/public_image_server/images/5e1258fbc6e41.png)

---
*Have a joke idea for a future post? Email ___[xtrp@xtrp.io](mailto:xtrp@xtrp.io)___ with your suggestions!*

*This joke comes from [Dad-Jokes GitHub Repo by Wes Bos](https://github.com/wesbos/dad-jokes) (thank you!), whose owner has given me permission to use this joke with credit.*

<!-- 
Joke text:
___Q:___ You know what the best thing about booleans is?

___A:___ Even if you are wrong, you are only off by a bit.
 -->
Random Front-end codes I learned today (#001) - Array destructure
Tags: javascript, webdev, codenewbie
Published: 2021-01-23 12:52:47

Without further intro, I'll go straight to the point.

###What is Array destructure?###

As [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) describes it, _destructuring_ is a way of unpacking values from, in our case, an Array (or properties from an Object, but we'll focus on the Array on this topic).

There are a lot times, when I want to access a value from an array, say the first value, and store it in a variable, this is what I normally do:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/komj1r0c57d66sx7gl4j.png)


With array destructuring, I discovered that I can do that in just a single line of code.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bvqz78f6dc1ny1ei88cs.png)

This means that the first value of the array (which is **pencil**) will immediately be stored to a variable _pencil_. It could also be another variable name, and it'll still be of the same result:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0l8e5mjpsgk8jkzoc9oi.png)
A Step-by-Step Guide Deploying A Static Site or Single-page App to github pages
Tags: github
Published: 2021-01-23 12:43:35

---
title: A Step-by-Step Guide Deploying A Static Site or Single-page App to github pages
published: true
description: 
tags: github
---

In this tutorial, you will learn how to set up and deploy your site to [github pages](https://pages.github.com/) manually and automatically using [github actions](https://github.com/features/actions).


## Using gh-pages package

1.  Install [gh-pages](https://github.com/tschaub/gh-pages) locally `npm install gh-pages --save-dev`
2.  Add new script to `package.json` file to deploy your website

```json
    "scripts": {
      // replase dist with your build dir folder
      "deploy": "gh-pages -d [dist]"
    }
    /*
     * Replace <username> and <repositoryname> with your username
     * from GitHub and the name of your new repository.
     */
    "home": "https://<username>.github.io/<repositoryname>/",
```

3.  Deploy your website to Github Pages by running this command `npm run deploy`

> `gh-pages` behind the scenes will create another branch called `gh-pages` to push your build files into it

## Using Github Actions

1. Create folder `.github`

2. Create [file].yml and name it with any name you like

3. Open the file and past the content below

```yml

# Runs build and test
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x]

    steps:
      - name: Checkout 🛎️
        uses: actions/checkout@v2.3.1 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly.
        with:
          persist-credentials: false
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}

      - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
        run: |
          npm ci
          npm run build

      - name: Deploy 🚀
        uses: JamesIves/github-pages-deploy-action@3.7.1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH: gh-pages # The branch the action should deploy to.
          FOLDER: _site # The folder the action should deploy.
          CLEAN: true # Automatically remove deleted files from the deploy branch
```

> Notes: The above set up will work on every push and every pull request created

Finally, you have to push to the main branch to watch your workflow working automatically
Ruby: proc and lambda
Tags: ruby
Published: 2021-01-23 12:37:03

---
title: Ruby: proc and lambda
published: true
description: The subtle difference between proc and lambda.
tags: Ruby
//cover_image: https://direct_url_to_image.jpg
---

## Example

```ruby
hash = {foo: :bar}
nested_array = [[1, 2]]
proc_printer = Proc.new {|a, b| puts "a: #{a}, b: #{b}" }
lambda_printer = lambda {|a, b| puts "a: #{a}, b: #{b}" }

hash.each(&proc_printer) # => a: foo, b: bar
nested_array.each(&proc_printer) # => a: 1, b: 2
hash.each(&lambda_printer) # => a: foo, b: bar
nested_array.each(&lambda_printer) # => wrong number of arguments (given 1, expected 2) (ArgumentError)
```

## What happened?

A `lambda` takes argument differently than a `proc` does. In this case, an array in nested array case "gets extracted" into two arguments with a `proc`, while it is passes as one array with a `lambda`.

`Proc`s behave like blocks, and `lambda`s behave like methods. When used with methods such as `each`, which are usually used with blocks, it might be a good idea to use `proc`s instead of `lambda`s.
NoSQL with joins
Tags: nosql, typescript, node, npm
Published: 2021-01-23 12:34:28

With SavanahDB you can insert your document like this:

```
tb.insert({

 author:"john",
 price:500,
 country:"xxx",
 
})
```

And search through documents like this :

```
tb.search('(country == "yyy" & & author =="john" ) || price < 1400', {
 limit : 5
 join : {
    books : 'that.author == this.name', 
 genre: 'that.name == this.genre as genre_info'
}}) 
```

Pretty amazing right?
It's right here: Kanna_Sip https://npmjs.com/savanahdb

It's just a beta but works,a stable release will arrive in Saber Edition dropping soon!! 

I am just one student working on this so if you would like to support me you can become my patron here : https://patreon.com/savanah
⚡️ Full TypeScript Beginner's Course [Free!]
Tags: javascript, typescript, webdev, tutorial
Published: 2021-01-23 12:27:02

![CodeSnap Intro](https://i.imgur.com/lpjigdW.png)

Over lockdown, I wrote, shot and edited a full TypeScript course for my website, [CodeSnap](https://codesnap.io).

It's been designed for JavaScript developers who want to learn TypeScript in a way which they're already familiar with.

The best thing is - it's totally free!

[**Watch the full course here!**](https://codesnap.io/course/introduction-to-typescript)

## Details

- ⏰ Full 2 hour course
- ✅ Everything you need to know to get started with TypeScript
- 📹 16 videos (each around 8-10 minutes long)

## All Chapters

### Introduction & Setup

**Chapter 1:** [What is TypeScript?](https://codesnap.io/course/introduction-to-typescript/what-is-typescript)
**Chapter 2:** [Welcome to the course!](https://codesnap.io/course/introduction-to-typescript/welcome)
**Chapter 3:** [Setting up our environment (TypeScript, ESLint and Prettier)](https://codesnap.io/course/introduction-to-typescript/setting-up-project)

### Getting Started

**Chapter 4:** [Basic Types (strings, numbers etc)](https://codesnap.io/course/introduction-to-typescript/basic-types)
**Chapter 5:** [Type Inference](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 6:** [Union Types](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 7:** [Arrays & Tuples](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 8:** [Any & Unknown](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 9:** [Undefined & Null](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 10:** [Enums](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 11:** [Interfaces](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 12:** [Functions](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 13:** [Literal Types](https://codesnap.io/course/introduction-to-typescript/)

### Writing a mini project with everything we've learned

**Chapter 14:** [Writing an application in TypeScript - Part 1](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 15:** [Writing an application in TypeScript - Part 2](https://codesnap.io/course/introduction-to-typescript/)
**Chapter 16:** [Writing an application in TypeScript - Part 3](https://codesnap.io/course/introduction-to-typescript/)

## Support

I loved making this course, but it took bloody ages to put together...!

If you want to support me, and encourage me to make more videos & courses like this, I'd love it if [you could sign up to the email list](https://codesnap.io). It gives me a bit more guidance to see the amount of people interested in the content, and keeps me motivated to make more!

## Thanks!

Thanks for watching - any and all feedback is greatly appreciated, and please share it around if you think it'll be useful to anybody else.
SavanahDB
Tags: database, nosql, npm, node
Published: 2021-01-23 12:22:53


SavanahDB is a NoSQL DBMS that supports joins, complex relational and realSync to provide the best experience for the developer and performing much better than most traditional DBMS

The Hare Edition - 0.1.0 is out for public use now at https://npmjs.com/savanahdb

I would appreciate if you download it, play around and give some feedback. Share the post or the npm package if you like the concept! 

The Saber Edition is coming soon with features geared towards enterprise use and production environment 

I am a Student and currently the only one working on this, so if you would like SavanahDB to continue it's path I would really appreciate becoming a patron here : https://patreon.com/savanah

Ofcourse it's free to use and always will be free. No compulsions to donate.
MongoDB Cheat Sheet(Beginners).
Tags: mongodb, programming, beginners
Published: 2021-01-23 12:20:43

<h1>This blog contains a very basic cheat sheet for MongoDB. This blog might be helpful if you are looking for a cheat sheet.</h1>

<li>show dbs -> to show databases</li>

<li>use {database name} ->  To create & use a database</li>

<li>db.createCollection("collection name") -> To create a collection</li>

<li>db -> To check current database</li>

<li>db.dropDatabase() -> To delete/drop a database</li>

<li>db.[collection-name].drop() -> To delete/drop a collection</li>

<li>show collections -> To show collections</li>

<li>db.[collection-name].insertOne({key:value}) -> To insert one</li>

<li>db.[collection-name].insertMany([{key:value}, {key:value}]) -> To insert many</li>

<li>db.[collection-name].find(query(optional), projection(optional))-> To find data</li>

<li>db.[collection-name].find(query(optional), projection(optional)).pretty() -> To find data and prettify it</li>

<li>db.[collection-name].find().count() ->  To count the number of data in a collection</li>

<li>db.[collection-name].find().sort({value:1}) -> To sort the values : -1 : Descending, 1 : Ascending</li>

<li>db.[collection-name].find().limit(value) -> To limit the data show</li>

<li>db.[collection-name].updateOne({_id:1}, {$set: {age:21}}) -> To update one set of value</li>

<li>db.[collection-name].updateMany({_id:1}, {$set: {age:21}}) -> To update many set of value</li>

<li>db.[collection-name].deleteOne({_id:1}) -> To delete</li>


<h1>I made this basic cheat sheet when I was learning MongoDB. I thought of sharing it as it might help many beginners. If I made any mistake while writing this, you can write this in the comment's and let me know.</h1>
Writing a polyfill for getElementsByClassName()
Tags: javascript, programming, webdev, beginners
Published: 2021-01-23 12:03:18

Since the start of this new year I've started posting code along videos on YouTube to help JavaScript newbies.

This is my first post here!

Now lets see how to write a polyfill for `document.getElementsByClassName`.

# Why is it required?

We all know that there are numerous web browsers, and not all the browsers provide all the inbuilt functions. Hence, we write polyfills to make sure that our code works on all the platforms. 

We are taking an example of `getElementsByClassName` for this one.

# index.html

Lets create a sample `.html` file.

```html
  <body>
    <div></div>
    <div>
      <div>
        <div>
          <div>
            <div>
              <header class="wanted"></header>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div>
      <p></p>
      <p>
        <span></span>
        <span class="wanted">Code along with Vishal</span>
        <span></span>
      </p>
      <p class="wanted"></p>
    </div>
    <div class="wanted"></div>
    <div></div>

    <script src="scripts/findByClass.js"></script>
  </body>
```

we want to write a JS function which would traverse over each of the DOM elements and fetch all the elements with the class `wanted`.

# findByClass.js

Below is my implementation of this polyfill

```javascript
document.findByClass = function(requiredClass) {
  const root = this.body;

  function search(node) {
    let result = [];

    if(node.classList.contains(requiredClass)) {
      return node;
    }

    for (const element of node.children) {
      result = result.concat(search(element));
    }

    return result;
  }

  return search(root);
}
```

Now, upon calling `document.findByClass('wanted')` would return a list of all the elements with the class `wanted`.

# Video tutorial and explanation

Please visit my YouTube channel to watch me writing this code and explaining every step in detail!

[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/9T7o_VQ0L70/0.jpg)](https://www.youtube.com/watch?v=9T7o_VQ0L70)

Show some love! so that I can continue making such videos, and also let me know what else I should talk about?
This 7 Useful Mac Tools with improve productivity with a better Desktop Management
Tags: productivity, tools, mac, webdev
Published: 2021-01-23 11:57:17

## Spaces Tools

### Workspaces

Create a Space with preconfigured applications.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5hx4t3svawak93s7d82i.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mlltgg8czi815cc53dac.png)

Link : [Workspaces](https://www.apptorium.com/workspaces)

### Mission Control Plus

Manage your windows in Mission Control, adding keyboard navigation, shortcuts and more.

![Image-1](https://imgix-blog.setapp.com/mission-control-plus-windows.png?auto=format&ixlib=php-3.3.0&q=75)

Link : [Mission Control Plus](https://www.fadel.io/missioncontrolplus)

## Desktop Tools

### Vanilla

Hide menu bar icons on your Mac.

![Image-2](https://matthewpalmer.net/vanilla/vanilla-square-gif.gif)

Link : [Vanilla](https://matthewpalmer.net/vanilla/)

### Be Focused Pro 

Focus on a specific task with a Podomoro timer.

![Image-3](https://cdn.setapp.com/blog/images/create-task-befocused.gif)

Link : [Be Focused Pro](https://apps.apple.com/fr/app/be-focused-pro-focus-timer/id961632517?mt=12)

### Horo / Zee Timer 

The best free timer app for Mac

![Image-4](https://matthewpalmer.net/horo-free-timer-mac/demo.gif)

![Image-5](https://is1-ssl.mzstatic.com/image/thumb/Purple114/v4/29/78/30/2978300b-a12e-42ed-e89a-c78a80e569e9/pr_source.png/800x500bb.jpg)

Link : [Horo](https://matthewpalmer.net/horo-free-timer-mac/)

Link : [Zee Timer](https://apps.apple.com/us/app/countdown-timer/id1453356099?mt=12&ign-mpt=uo%3D4)

### Mousepose

Add spotlight to your mouse cursor

![Image-6](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yMDc5NTk4Ni0xZGFhYjk3MmM4OWRkYTQ2LmdpZg)

Link : [Mousepose](https://boinx.com/mousepose/)

## Shortcuts Tools

### CheatSheet

Open CheetSheet of all shortcuts for a specific application.

![Image-7](https://mediaatelier.com/CheatSheet/imgs/main.png)

Link : [CheatSheet](https://mediaatelier.com/CheatSheet/)
写给女朋友的 SQL 教程——历史和关系模型
Tags: sql
Published: 2021-01-23 11:40:28

学习新概念经常陷入的误区之一是：先生硬地记下，而不是尝试理解其含义。读书时老师经常讲“要理解着记忆”，这个思想在此处也同理。一个新概念必然是为了解决一个问题而出现的，所以在介绍新概念之前，要首先了解其诞生的历史背景。

1970年代，IBM 的工程师从 Edgar F. Codd 的关系模型[1]中得到灵感，设计了一个用于操作他们的半结构化数据库 System R[2]的语言：*SEQUEL* (*Structured English Query Language*)，由于商标原因后改称为 SQL。这也是经常有人将 SQL 读作 *[siːkwəl]* 的原因。SQL 先后在 System/38, SQL/DS, DB2 等基于 System R 的数据库上大放异彩，这让Oracle (Relational Software, Inc.) 从中得到了灵感。1979年，Oracle 发布了他们的第一个基于 SQL 的商用数据库：Oracle V2。SQL 在商用关系型数据库上的成功使得其成为了事实标准，ANSI 和 ISO 也随后相继采用 SQL 作为标准。

**SQL** 是 **Structured Query Language** 的缩写，从字面上翻译过来是“结构化查询语言”。“查询”和“语言”两词容易理解，那么何为“结构化”？既然 SQL 为操作关系模型而设计的，那么要解释“结构化”就首先要解释什么是“关系模型”。

关系模型认为数据都是以关系的形式存在的。想象一张标准的 Excel 表，每一行代表着一条记录（元组），每一列代表着这条记录中的一个属性（字段）。在关系模型中，将这张表的结构称为**关系模式** (**relation schema**), 表的值被称为关系。关系模式是对关系的描述。想象一张学生信息的表格，每个学生都要填写其姓名、学号、专业班级等信息，这些信息就是这个关系的**属性**；每个学生信息都是表格中的一行**记录**/**元组**。在学生填写表格之前。需要在表头给出每一列所需要填写的信息，表头中对每一列给出的约束就是关系模式。学生填写的一行行数据的集合是就是关系，关系是关系模式在某一时刻的内容。关系模式规定了关系的**结构**，**SQL 即是被设计用来对这种结构进行查询的语言**。

*表1，学生表格的一种结构*

| 姓名  | 学号         | 专业   |
|:---:|:----------:|:----:|
| 张三  | 222016XXXX | 软件工程 |

SQL 在成为结构化查询的事实标准后，其使用的范围已经不局限于 RDBMS 领域。比如在大数据领域中，几乎所有组件都离不开 Google 提出的“三驾马车”。在开源实现中，HDFS 和 MapReduce 这两驾马车组成了 Hadoop 的核心。但是 Hadoop 有非常陡峭的学习曲线，颇有“不食人间烟火”的高冷意味。既然 SQL 的通用性这么强，能否通过 SQL 来实现 Hadoop 的使用？于是 Hive 应运而生了。Hive 是一个数据仓库，它能够将 Hive SQL (一种类似 SQL 的语言[4])转换成 MapReduce 任务，从而提交到 Hadoop 集群上。

---

[1] https://en.wikipedia.org/wiki/Relational_model  
[2] https://en.wikipedia.org/wiki/IBM_System_R  
[3] 这里的数据库模式对应三级模式中的概念模式  
[4] ISO 规定了 SQL 标准，各数据库采用不同了语法的**方言**