官网
做所有护肤之前,最关键的就是彻底的清洁皮肤。这道理大家自然都懂,不把灰尘、油污、余妆和死去的角质洗干净,再贵的护肤品也好好没法吸收,黑头、闭口什么的也会随之而来。

Luna是Foreo公司研发制造的,官方提供的原理和功效:LUNA™露娜™系列通过每分钟8000次T-sonic™透肤声波脉动,配合柔软温和的硅胶触点直接作用于肌肤表面,有效去除98.5%的污垢与杂质,比普通尼龙刷头卫生35倍。收缩毛孔,帮助淡化粉刺和痘痕,促进血液微循环,焕发肌肤光泽。
Luna的Foreo是家瑞典公司,得过很多国际美容设计奖项,也是第一个把医用硅胶应用到精密抗衰老仪和洗脸仪的公司。

ad6d8bbd.png

luna系列产品很多,如何选择?
很简单,当然要选择性价比最高的

因为相对于1代luna,2代产品刷头和档位数有明显提升,我首先就排除了1代产品,直接在2代中选择。在2代产品里,有luna 2和luna mini 2。玩趣版的我就不专门介绍了,可以使用100分钟,约100次。

bda4b691.png

标准版

主要区别就是Luna 2贵一些,体积大,有12个档位,反面是波纹状,针对不同的肤质有不同的颜色

mini版

luna mini 2是8个档位,反面没有波纹,是更适合油性痘痘肌肤的粗胶粒,混合型皮肤可以用来清洁T区

如果选择

选MINI还是标准?
我知道这是很多人会纠结的问题,所以来分别说下各型号特点:
无论1代或2代,MINI只是纯洗脸的,无导入按摩面,而且MINI不分颜色,全肤质通用。标准版都有导入按摩面,同时针对不同肤质有颜色区别,比如:
1代标准粉即适合敏感肌又适合中性肌。
2代标准粉只适合中性肌。
2代标准紫适合敏感肌。
2代湖绿适合油性肌。
等等……
还有使用次数的区别:
MINI充满一次电可使用300次左右。
标准充满一次电可使用450次左右。
所以看大家需求,只是洗脸用MINI即可,想方便天天用到导入按摩,就选标准!

推荐植物:绿萝、吊兰、薄荷、铁线蕨、常春藤、铜钱草、袖珍椰子、虎皮兰等。

薄荷

异味克星
e658dc80.png

虎尾兰

自然系除湿器,天生爱喝水的叶子,可以自动吸收空气中的水蒸气。
6dfab82d.png

常春藤

带有杀菌与净化空气功能的常春藤,是天然的环境清洁器
a80ea411.png

constexpr C++11

constexpr - 指定变量或函数的值能出现在常量表达式中
在C++11里,C++引入了名为constexpr(常量表达式)的特性,被constexpr修饰的函数,如果满足一定条件,其返回值是可以在编译时计算出来的,在生成的汇编中将不会包含这个函数的任何代码。

函数后面加const修饰

给隐含的this指针加const,也就是说这个函数中无法改动数据成员了

#include<iostream>
using namespace std;
class temp
{
public:
temp(int age);
int getAge() const;
void setNum(int num);
private:
int age;
};

temp::temp(int age)
{
this->age = age;
}

int temp::getAge() const
{
age+=10; // #Error...error C2166: l-value specifies const object #
return age;
}

void main()
{
temp a(22);
cout << "age= " << a.getAge() << endl;
}

下载地址

./bootstrap
make
sudo make install
//验证版本
cmake --version

首先我们编写一个main.cpp文件,一个简单的helloworld程序

#include<iostream>
int main()
{
std::cout<<"hello world!"<<std::endl;
return 0;
}

然后编写CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8)
#工程名
project(HELLOWORLD)
#包含原程序,即把给定目录下的源程序复制给变量DIR_SRC
#将指定路径下的源文件储存在指定的变量中
aux_source_directory(DIR_SRC ./)
#生成程序
add_executable(helloworld ${DIR_SRC})

编译

$mkdir build
$cd build
$cmake ..
$make
$./helloworld

<utility>
std::make_pair
std::pair

std::make_pair
std::pair
boost::variant

std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
例如std::pair<int,float> 或者 std::pair<double,double>等。
pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。
初始化一个pair可以使用构造函数,也可以使用std::make_pair函数,make_pair函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }

阅读全文 »

  1. iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像。
  2. const_iterator 对象可以用于const vector 或非 const vector,它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值。
  3. cbegin()和cend()是C++11新增的,它们返回一个const的迭代器,不能用于修改元素。
auto i1 = Container.begin();  // i1 is Container<T>::iterator
auto i2 = Container.cbegin(); // i2 is Container<T>::const_iterator

转移笔记

错误#4:没有使用make_shared来初始化shared_ptr!

相较于使用裸指针,make_share有两个独特的优点:

  1. 性能: 当你用new创建一个对象的同时创建一个shared_ptr时,这时会发生两次动态申请内存:一次是给使用new申请的对象本身的,而另一次则是由shared_ptr的构造函数引发的为资源管理对象分配的。
shared_ptr<aircraft> pAircraft(new Aircraft("F-16")); // Two Dynamic Memory allocations - SLOW !!!
</aircraft>

与此相反,当你使用make_shared的时候,C++编译器只会一次性分配一个足够大的内存,用来保存这个资源管理者和这个新建对象。

shared_ptr<aircraft> pAircraft = make_shared<aircraft>("F-16"); // Single allocation - FAST !
</aircraft></aircraft>
  1. 在看了MS编译器的memory头文件实现以后,我发现当内存分配失败时,这个对象就会被删除掉。这样的话使用裸指针初始化也不用担心安全问题了。
    建议- 使用make_shared而不是裸指针来初始化共享指针。

unique_ptr

std::unique_ptr
只有一个智能指针指向对象,不能共享。

  1. 无法进行复制构造与赋值操作.
  2. 可以进行移动构造和移动赋值操作
  3. 可做为容器元素
// 通过原始指针创建 unique_ptr 实例
std::unique_ptr<Task> taskPtr(new Task(23));

// 内部缓存
std::unique_ptr<unsigned char[]> m_spBuf;

// 方法2
if(m_spBuf == nullptr)
std::cout<<"m_spBuf is empty"<<std::endl;

m_pBufLength = 1024000;
m_spBuf = std::make_unique<unsigned char[]>(m_pBufLength);

m_pBufLength *= 10;
m_spBuf.reset(new unsigned char[m_pBufLength]);

m_spBuf.reset(nullptr);

unique_ptr<int> sp(new int(88) );
vector<unique_ptr<int> > vec;
vec.push_back(std::move(sp));
//vec.push_back( sp ); 这样不行,会报错的.
//cout<<*sp<<endl;执行了 move 操作之后 sp 被释放了


std::unique_ptr<dbo::backend::Postgres> m_pDb;
m_pDb = make_unique<dbo::backend::Postgres>(dbo::backend::Postgres(dbconn));

C++14 提供了 make_unique 来创建

auto ptr = make_unique<std::string>("senlin");
std::unique_ptr<char[]> chars(new char[1024]);

C++11 简单封装一下

template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&&... params)
{
return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}

shared_ptr

使用引用还是值传递参数?
简短的答案是:没有理由使用值传递

by const reference: void foo(const shared_ptr<T>& p)
or by value: void foo(shared_ptr<T> p)

std::make_shared<类型>(参数);

This question has been discussed and answered by Scott, Andrei and Herb during Ask Us Anything session at C++ and Beyond 2011. Watch from 4min 34sec on shared_ptr performance and correctness.

使用 std::move

void CompilerInstance::setInvocation(
std::shared_ptr<CompilerInvocation> Value) {
Invocation = std::move(Value);
}

std::shared_ptr 的引用计数是原子操作,比非原子操作耗时。
通过 move 操作,复制了原指针的引用计数,同时原指针置为空

std::make_shared

#include <iostream>
#include <memory>

void foo(const std::shared_ptr<int>& i)
{
(*i)++;
}

int main()
{
auto sp = std::make_shared<int>(12);
foo(sp);
std::cout << *sp << '\n';
}

weak_ptr

获取当前应用路径

func getCurrentDirectory() string {
dir, err := filepath.Abs(filepath.Dir(os.Args[0])) //返回绝对路径 filepath.Dir(os.Args[0])去除最后一个元素的路径
if err != nil {
log.Fatal(err)
}
return strings.Replace(dir, "\\", "/", -1) //将\替换成/
}

遍历目录下文件和目录

//获取指定目录下的所有文件和目录
func GetFilesAndDirs(dirPth string) (files []string, dirs []string, err error) {
dir, err := ioutil.ReadDir(dirPth)
if err != nil {
return nil, nil, err
}

PthSep := string(os.PathSeparator)
//suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

for _, fi := range dir {
if fi.IsDir() { // 目录, 递归遍历
dirs = append(dirs, dirPth+PthSep+fi.Name())
GetFilesAndDirs(dirPth + PthSep + fi.Name())
} else {
// 过滤指定格式
// ok := strings.HasSuffix(fi.Name(), ".log")
// if ok {
// files = append(files, dirPth+PthSep+fi.Name())
// }
files = append(files, dirPth+PthSep+fi.Name())
}
}

return files, dirs, nil
}

参考1
参考2

除非特殊说明,否则字节序都是 Little-Endian 的。
文件是由多个 block 组成的,每个 block 结构如下:

77a7947c.png 94a1b129.png
字节数 内容 说明
4字节 0xF9 0xBE 0xB4 0xD9 Magic Number,用于确认block开始
4字节 Block Length unsigned int
Block Length CBlock类序列化后的数据 CBlock类定义在block.h文件中

CBlock 数据包括 CBlockHeader 以及一些列的 CTransaction 数据,
其中 CBlockHeader 80 bytes 包括:

阅读全文 »