网上看到的一些原则,记录一下,备查。

  1. api与用户通信总是使用HTTPS协议:https://api.github.com;
  2. 尽量将API部署在专属域名下,https://api.github.com;加入API很简单,不会有扩展,则可以考虑放到主域名下,例如https://www.github.com/api;
  3. 版本号放在url中,https://developer.github.com/v3;或将版本号放在头信息中,例如访问https://api.github.com的REST(V3版本)时,Accept: application/vnd.github.v3+json;
  4. api网址,或者说是endpoint,每个endpoint代表一种资源,这也是路径不能为动词的原因:用户https://api.github.com/users;某个用户某个仓库的issue**https://api.github.com/repos/username/repo_name/issues?parameter=val; 某个用户的仓库https://api.github.com/user/repos;
  5. URL定位资源;http动词表示操作;status code 表示操作结果:2XX成功、3XX重定向、4XX客户端错误、5XX服务器错误;
  6. Timestamps: ISO-8601
  7. Error handling

GET 返回码:200 (OK) + 404 (NOT FOUND) +400 (BAD REQUEST)
POST 返回码:200 (OK) or 201 (CREATED)
PUT 返回码:200 (OK) + 404 (NOT FOUND) +400 (BAD REQUEST) 409 Conflict
DELETE 返回码:200 (OK)

Authentication

  1. OAuth2
  2. api_key: api.geocod.io/v1/geocode?q=42370 Bob Hope Drive, Rancho Mirage CA&api_key=YOUR_API_KEY

go内置的一个容器类,实现为双向链表。

import "container/list"

遍历

for e := l.Front(); e != nil; e = e.Next() {
// do something with e.Value
}
阅读全文 »

比特币白皮书
以太坊白皮书

1991年区块链由一组研究人员开始使用,最开始的目的是为了给数字文档做时间戳,所以不能回溯和篡改,起到公正的作用。
2009年作为比特币的底层基础技术被公众所熟知。
区块链是一个分布式的账簿,对每个人公开。当一些信息记录在区块链中时,很难去修改。
一个块 = data + hash + hash of previous block

  1. data 依赖于区块链的类型,例如比特币保存的是详细的交易信息,例如,发送者,接收者,交易数量
  2. 每个块都有一个 hash 值,类似指纹,用来唯一标识一个块和内容的。一旦块的内容有一点点的变动,hash 值都会不同。
  3. 第三部分是前一个块的 hash 值,这样就构成了一条区块链

hash 算法使用sha-256算法。再用 RSA 对 hash 值做签名。

一条区块链的第一个块的第三部分是0,因为他没有前面的块。

举例:
现在有1,2,3个区块组成的区块链。如果2被修改,那么3的前块hash值就会和2的 hash 值不同。

问题1. 现在电脑速度很快,如果把2后面的所有块的 hash 值都修改了呢?
解决方法:区块链引入了 proof-of-work 机制,就是减慢创建新区块的速度,比特币大约需要10分钟计算出新区块,来加入区块链。
这个机制使篡改更加困难,因为要计算所有后面的区块。

结论:区块链的安全性在于:hash 和 proof-of-work 机制,还有一个就是分布式。

区块链采用点对点网络连接,任何人都可以加入,当一个新用户加入时,会复制一份完整的区块链。一个节点可以利用这个特性来验证是否一切正常。
当一个新的区块被创建时,会发给网络上的所有节点,每个节点验证新的区块,验证通过后加入到自己的区块链中,网络中所有的节点都保持一致。被篡改的区块会被网络中其他的节点拒绝。

所以要成功篡改一个区块,需要篡改所有链上块,为每个块重新计算 proof-of-work ,控制超过50%的节点,这样才会让其他的节点认可被篡改过的区块链。看起来基本上不太可能做到。

区块链仍然在持续改进,目前出现了“智能合约”,这些合约是存储在区块链中的简单程序,可以在某些条件下自动完成交易

区块链解决的一致性问题:

  1. 如何同步
  2. 防止篡改
  3. 同一笔交易重复使用

将新制作的区块所包含的内容(前一块的hash+新块基本信息+新块所包含的所有交易记录)组成一个字符串
生成一个随机数添加到尾部组成新的字符串
计算sha-256值,并且前72位的值都是0才算通过。这里72是目前的位数,会随着时间而调整难度。

如果同时产生两个新区块,那么同时保留,在矿工制作下一个新区块的时候,只能基于一个区块制作。然后保留最长的那个区块。短的被抛弃掉。
没有保存主链中的交易都是待确认交易。

智能合约

“智能合约”一词第一次使用是在1997年,想要使用一个分布式账簿存储合约,是数字化的现实世界的合约,是存储在区块链中的一小块计算机程序。

举例说明:
一个项目在众筹平台筹集资金,筹集人希望达到目标金额后拿到资金,投资人希望达到目标后资金能够给筹集人使用,并且如果筹集失败能够拿回投资金额。
这里的众筹平台必须是可信任的。

现在使用智能合约来完成上面的事情。发起一份智能合约,投资人的钱都转到自能合约中,程序会在达到目标金额后自动转账给筹集人,如果失败就自动返回给投资人。这一过程不需要第三方。同时基于区块链的安全保障。

以太坊就是针对智能合约而创建的。使用一种特殊的语言 Solidity 来实现智能合约,语法类似于javascript

布局属性

<edit name="edit_username" pos="530,{148,@208,@32" margin="0" colorText="#000000" font="face:宋体,bold:1,size:20" />

获取内容

SEdit* pEdit = (SEdit*)FindChildByName(L"edit_termId");
SStringT terminalNo = pEdit->GetWindowText();

响应EN_CHANGE事件

void OnEnChangeOrderAmount(EventArgs *pEvt);

void CMainDlg::OnEnChangeOrderAmount(EventArgs *pEvt)
{
STRACE(_T("OnEnChangeOrderAmount,iNotify = EN_CHANGE"));
}

//soui消息
EVENT_MAP_BEGIN()
...
EVENT_NAME_HANDLER(L"edit_orderAmount", EVT_RE_NOTIFY, OnEnChangeOrderAmount)
EVENT_MAP_END()

响应 EN_SETFOCUS 事件

BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
{
m_bLayoutInited = TRUE;

SEdit* pEdit = (SEdit*)FindChildByName(L"edit_orderAmount");
pEdit->GetEventSet()->subscribeEvent(EVT_SETFOCUS, Subscriber(&CMainDlg::OnSetFocusOrderAmount, this));
...
}

bool CMainDlg::OnSetFocusOrderAmount(EventArgs * pEvtBase)
{
EventSetFocus *pEvt = (EventSetFocus*)pEvtBase;
STRACE(L"OnSetFocusOrderAmount....");

return true;
}

设置光标位置

pEdit->SSendMessage(EM_SETSEL, -1, -1);

could not launch process: stub exited while waiting for connection: exit status 0

couldn’t start listener: listen tcp 220.250.64.225:51724: bind: can’t assign requested address

最近 go get 总是超时,于是一通折腾,结果 goland 无法调试了,花了好久才找到原因。
上面两个提示都是因为 /private/etc/hosts 文件里面缺少 127.0.0.1 localhost 这一行

ld: symbol(s) not found for architecture x86_64

zmq 需要使用 cgo,而 cgo 不能交叉编译

cannot use path@version syntax in GOPATH mode

暂未处理

蚝油用途广泛,适合多种食材:肉类,蔬菜,豆制品,菌类等,蚝油是鲜味调料。
蚝油含有丰富的微量元素和多种氨基酸,可以用于补充各种氨基酸及微量元素,其中主要含有丰富的锌元素,是缺锌人士的首选膳食调料。

蚝油芡汁在菜肴八成熟时下锅最好,较易显色且蚝味香浓,且忌在炝锅操作时使用
蚝油也是腌制食材的好调味料,可使蚝油特有的鲜味渗透原料内部,增加菜肴的口感和质感。 在烹饪肉类内脏时,用蚝油腌制后,可以去除内脏的腥味,令其酱味香浓、提鲜。

使用注意

  1. 和调味品混合时切忌与辛辣调料、醋和糖共享。因为这些调料均会掩盖蚝油的鲜味和有损蚝油的特殊风味。
  2. 久煮会失去鲜味,一般是在菜肴即将出锅前或出锅后趁热立即加入蚝油调味为宜,若不加热调味,则味道将逊色些。特别是焖制菜肴时,宜用中、慢火。
  3. 忌高温烹煮,否则会失去特有鲜味,营养成分散失。

原文

翻译+整理,翻阅的时候方便些,只翻译了可能用到的。
这个指南描述怎么使用 protocol buffer 语言来描述数据,包括 proto 文件语法和如何生成数据访问类。支持的是 proto3 版本

定义一个消息类型(Message Type)

先来看一个非常简单的例子。定义一个搜索请求消息格式,每个请求有一个查询字符串,搜索结果的指定页和每页的结果数量。下面是定义消息类型的 .proto 文件
一个 .proto 文件可以定义多个消息类型。

syntax = "proto3";

/* SearchRequest represents a search query, with pagination options to
* indicate which results to include in the response. */
message SearchRequest {
string query = 1;
int32 page_number = 2; // Which page number do we want?
int32 result_per_page = 3; // Number of results to return per page.
}

message SearchResponse {
...
}

第一行指定版本,默认是 proto2,必须是文件的第一个非空,非注释行。
SearchRequest 定义了这个消息所需要的数据,包括三个字段(键值对),每个字段都有一个名字和类型。
使用c/c++风格的注释

阅读全文 »

草莓的相关知识。

清洗

最好用自来水不断冲洗,流动的水可避免农药渗入果实中,2-3分钟左右。
最好再用淡盐水或碱性苏打粉(淘米水)各浸泡3分钟
淡盐水可以杀灭草 莓表面残留的有害微生物;
淘米水呈碱性,可促进呈酸性的农药降解

注意事项:
不要把草莓蒂摘掉,去蒂的草莓若放在水中浸泡,残留的农药会随水进入 果实内部,造成更严重的污染。
也不要用洗涤灵等清洁剂浸泡草莓,这些物质很难清洗干净,容易残留在果实中,造成二次污染。

营养

维生素C含量非常高
不宜和酸奶或牛奶里一起食用:草莓中的成分会影响酸奶和牛奶中钙的吸收,还会降低乳蛋白的吸收率

6块腹肌的锻炼方法和每个方法对应的部位。

c6bad6b0.png

什么是protocol buffers(简称pb)

序列化结构数据的一种灵活,高效,自动化机制,类似 XML 但是更小,更快,更简单。
定义你的结构数据,然后就可以使用多种语言读写。

怎么工作

.proto 文件中指定你要序列化的信息的 pb 消息类型
每个 pb 消息就是一小块信息的逻辑记录,包括一些键值对。

定义好.proto文件后调用编译程序生成数据访问类

安装pb编译器

查看版本

protoc --version