Как объединить два репозитория Git?

1. cd path/to/project-B
2. git remote add project-a path/to/project-A
3. git fetch project-A
4. git merge --allow-unrelated-histories project-a/master # or whichever branch you want to merge
5. git remote remove project-A #опционально, если удалить репу коммиты остануться - названия веток нет.

docker 学习

#### 使用docker容易打包编译java程序
```Dockerfile
docker container run --volume $PWD:/helloworld-java-9 --workdir /helloworld-java-9 \
    -it --rm openjdk:9-jdk-slim \
    ./mvnw package
```

判断SQL Server数据表备注栏位是否超过8000个字符

Select * From t_ma_Report 
Where cast(txt_Config as varchar(8000))<>cast(txt_Config as varchar(7000))

header inclusion guard

#ifndef CAR_H
#define CAR_H

#include <string>
#include "engine.h"

class Car
{
	private:
		std::string color;
		int doors;
		Engine enginetype;

	public:
		Car (std::string, int);

		void setColor(std::string);
		void setDoors(int);
		void setEngine(std::string);

		std::string getColor();
		int getDoors();
		std::string getEngine();

};

#endif  /* CAR_H */

4. 理解 Kubernetes 对象

Kubernetes 对象在 Kubernetes API 中是如何表示的,以及如何在 .yaml 格式的文件中表示。  
Kubernetes 对象 是持久化的实体。Kubernetes 使用这些实体去表示整个集群的状态。  
它们描述了如下信息:
- 哪些容器化应用在运行(以及在哪个 Node 上)
- 可以被应用使用的资源
- 关于应用运行时表现的策略,比如重启策略、升级策略,以及容错策略
### 对象规约(Spec)与状态(Status)

每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 *spec* 和 对象 *status* 。 *spec* 是必需的,它描述了对象的 *期望状态(Desired State)* —— 希望对象所具有的特征。 *status* 描述了对象的 *实际状态(Actual State)* ,它是由 Kubernetes 系统提供和更新的。在任何时刻,Kubernetes 控制面一直努力地管理着对象的实际状态以与期望状态相匹配。

例如,Kubernetes Deployment 对象能够表示运行在集群中的应用。 当创建 Deployment 时,可能需要设置 Deployment 的规约,以指定该应用需要有 3 个副本在运行。 Kubernetes 系统读取 Deployment 规约,并启动我们所期望的该应用的 3 个实例 —— 更新状态以与规约相匹配。 如果那些实例中有失败的(一种状态变更),Kubernetes 系统通过修正来响应规约和状态之间的不一致 —— 这种情况,会启动一个新的实例来替换。

关于对象 spec、status 和 metadata 的更多信息,查看 [Kubernetes API 约定](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md)。
### 描述 Kubernetes 对象

当创建 Kubernetes 对象时,必须提供对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如名称)。 当使用 Kubernetes API 创建对象时(或者直接创建,或者基于`kubectl`),API 请求必须在请求体中包含 JSON 格式的

quicksort

package main

import "fmt"

func qs(l, r int, a []int) {
	if l >= r {
		return
	}
	i := l
	j := r
	k := int((l + r) / 2)
	for a[i] < a[k] {
		i++
	}
	for a[j] > a[k] {
		j--
	}
	if i <= j {
		t := a[i]
		a[i] = a[j]
		a[j] = t
		i++
		j--
	}
	qs(l, j, a)
	qs(i, r, a)
}

func main() {
	a := []int{88, 5, 4, 2, 7, 1, 2, 7, 2, 4}
	qs(0, len(a)-1, a)
	fmt.Println(a)
}

Streamlit -- Example CRUD app

# This page allows the user to view a list of members
# By default, the output will be a streamlit rendered pandas dataframe
# But there is also an option to render the output in raw HTML so that
# the member's profile URL can be visited by clicking on the
# "Profile" hyperlink that is only available in the raw HTML version.

import psycopg2
import os
import pandas as pd
import streamlit as st

# Obtain username/password saved as environment variables
user = os.environ['windowsuser']
pwd = os.environ['windowspwd']

# @st.cache prevents the streamlit app from executing redundant processes
# repeatedly that are expensive such as database connections or reading input
@st.cache(allow_output_mutation=True)
def get_query_results():
    """ A function that returns a table of members.
        Until streamlit provides a way to pageinate results,
        maximum of 1000 rows will be returned.
        Output can be either a streamlit rendered dataframe
        or raw HTML v

Helpers Crawler Puppeteer

Helpers para web scraping para puppeteer pupeter, com lazy loading lazyloading E com plugins para evitar carregamento de imagens css etc
const fs = require("fs");
const axios = require("axios");

function flatten(arr) {
  return arr.reduce(function(flat, toFlatten) {
    return flat.concat(
      Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten
    );
  }, []);
}

function uniq(arr) {
  return arr.reduce(function(a, b) {
    if (a.indexOf(b) < 0) a.push(b);
    return a;
  }, []);
}

function splitArrayWithCommas(arr) {
  let res = [];
  arr.forEach(item => {
    res.push(item.split(","));
  });
  return res;
}

function removeBlankSpaces(arr) {
  let res = [];
  arr.forEach(item => {
    item = item.trim();
    res.push(item);
  });
  return res;
}

function unifyArr(arr) {
  return flatten(splitArrayWithCommas(arr));
}

function removeRepeatItensInArray(arr) {
  return uniq(unifyArr(arr));
}

function forEachSync(array, callback) {
  let lastIndex = array.length - 1;
  let startIndex = 0;

  return new Promise((resolve, reject) => {
    let functionToIterateWith

MultiIndex in pandas

# Notes

Calculate the ratio of male grouped by occupation

```python

occupation_grouped = users.groupby('occupation')

# Get back a multiindex pandas' Series containing ratio 
# for each gender in each occupation
gender_ratio = occupation_grouped.value_counts(normalize=True)

# we can then unpack the Series to get back a dataframe
# then get the Male column
gender_ratio.unpack()['M']
```

Lộn xộn : Đen Vâu

Hi vọng chút feel còn sót lại, đêm nay sẽ lên 
vì ko biết ngày mai thức dậy viết được thêm hay sẽ quên 
ta ngồi thu lu trên ghế, như chu du trên thế 
giới, tạm quên đi bộn bề kéo tới khi ngày mới 
nới rộng màn đêm,ta dập tắt thuốc trong gạt tàn 
đôi khi ta thấy như con thú non bị lạc đàn 
ngoài kia là đời, đời là rừng, rậm bạt ngàn 
cô đơn sẽ biến mỗi chúng ta thành thú hoang 
ngòi bút lang thang trên đường kẻ, phẩy nghỉ, chấm là dừng 
Ôi là ta, tự nói rằng ta, chỉ nghỉ cấm được ngừng 
Cố lên, và cố lên, ánh sáng đâu biết chừng 
Sẽ xuất hiện , ta sẽ đối diện, khi mưa gió vừa ngưng 
Vẫn trở về, bước lề mề, sau giờ tan ca 
vẫn nhả khói, quên cả đói, thổi phù, tan ra 
Vẫn là tao, mãi cô độc, mãi gầy gò 
Đứng bên đời, nhìn xã hội, vẫn đang bày trò 

Hook: 
Đang ngổn ngang trên bàn, chỉ có giấy và mực 
Viết vòng rồi viết vo, đang phát ngấy và bực 
Nhìn lại hiện tại mọi thứ sao thấy mà cực 
Nhưng ta chỉ dừng lại nơi nào mà nơi đấy là vực 

Ver 2: 
đối với tao thì, khô

[pandas] Create new column based on values from another column

# Notes

```python
// Assume we have a 'gender' column with only M and F values
// solution 1
users['gender_n'] = [1 if gender == 'M' else 0 for gender in users['gender']]

// solution 2
users['gender_n'] = np.where(users['gender'] == 'M', 1, 0)

// solution 3
users['gender_n'] = (users['gender'] == 'M').astype(int)
```

Small helper script that automates Docker building and pushing

Small helper script that automates Docker building and pushing
#!/bin/bash

set -ex

PARENT_DIR=$(basename "${PWD%/*}")
CURRENT_DIR="${PWD##*/}"
IMAGE_NAME="$PARENT_DIR/$CURRENT_DIR"
TAG="${1}"

REGISTRY="hub.docker.com"

docker build -t ${REGISTRY}/${IMAGE_NAME}:${TAG} .
docker tag ${REGISTRY}/${IMAGE_NAME}:${TAG} ${REGISTRY}/${IMAGE_NAME}:latest
docker push ${REGISTRY}/${IMAGE_NAME}
docker tag ${REGISTRY}/${IMAGE_NAME}:latest ${REGISTRY}/${IMAGE_NAME}:${TAG}
docker push ${REGISTRY}/${IMAGE_NAME}

Crouton Debian XFCE setup

#Changing a computer name
/etc/hostname

/etc/hosts
  127.0.0.1     localhost.localdomain localhost
  127.0.1.1     newname

# scaling 
# Appearance > Fonts > Custom DPI setting



#install firefox
#download and move to ~/firefox
# extract tar
tar xjf firefox-73.0.1.tar.bz2 
mv firefox ~/firefox/
#then call to open 
~/firefox/firefox

# install git
sudo apt-get install git

# install whisker menu
sudo apt-get update; sudo apt-get install xfce4-whiskermenu-plugin

# install google chrome hack way

chronos@localhost / $ su vi /mnt/stateful_partition/crouton/chroots/debian/etc/pam.d/su-l
comment out this line ( with a # )
# session optional pam_keyinit.so force revoke
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb

# install clion
sudo apt install cmake gcc g++ clang
sudo tar xfz ~/Downloads/CLion-*.tar.gz -C /opt
cd /opt/clion-<version>/bin
./CLion.sh

fancy button animation

.button {
	display: inline-block;
	vertical-align: middle;
	-webkit-transform: perspective(1px) translateZ(0);
	transform: perspective(1px) translateZ(0);
	position: relative;
	-webkit-transition-property: color;
	transition-property: color;
	-webkit-transition-duration: 0.5s;
	transition-duration: 0.5s;
}

.button:before {
	content: "";
  position: absolute;
  z-index: -1;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: #d5a531;
  -webkit-transform: scaleX(0);
  transform: scaleX(0);
  -webkit-transform-origin: 0 50%;
  transform-origin: 0 50%;
  -webkit-transition-property: transform;
  transition-property: transform;
  -webkit-transition-duration: 0.5s;
  transition-duration: 0.5s;
  -webkit-transition-timing-function: ease-out;
  transition-timing-function: ease-out;
}

.button:hover {
	color: white!important;
}

.button:active {
	background: #d5a531;
}

.button:hover:before {
	-webkit-transform: scaleX(1);
	transform: scaleX(1);
	-webkit-transition-timing-function: cub

Setting State Correctly

this.setState((prevState, props) => {
  return {
    persons: persons,
    //changeCounter: this.state.changeCounter + 1 // может так выйти, что реакт не сразу обновит стейт, а только когда будет для этого возможность. тогда не факт, что в this.state будет нужное значение. поэтому есть такой паттерн, чтобы взять предыдущее значение из функции (prevState)
    changeCounter: prevState.changeCounter + 1
  };
});

HOC

import React from "react";

// 1.
// const withClass = props => (
//   <div className={props.classes}>{props.children}</div>
// );


// 2.
const withClass = (WrappedComponent, className) => {
  return props => (
    <div className={className}>
      <WrappedComponent {...props} /> {/*чтобы пропсы пробрасывались*/}
    </div>
  );
};

export default withClass;

// В 1 случае обертка над JSX компонентом <WithClass></WithClass>

// Во втором в App.js export default withClass(App, classes.App);
// Второй случай более используется для добавления логики, нежели просто хтмл или стили