一份VSC的本地设置

本地UI设置:

{
    "editor.tabSize": 2,
    "editor.formatOnSave": true,
    "clang-format.executable": "D:\\Program Files\\LLVM\\bin\\clang-format.exe",
    "git.path": "D:\\Program Files\\Git\\bin\\git.exe",
    "window.zoomLevel": 1,
    "explorer.confirmDelete": false,
    "git.confirmSync": false,
    "files.autoSave": "afterDelay",
    "editor.wordWrapColumn": 200
}

.clang-format 文件配置:

BasedOnStyle: llvm
BreakBeforeBraces: Linux
BreakBeforeBraces: Attach
Language: Cpp
ColumnLimit: 120

VSC中clang-format设置函数括号风格

目前发现一个问题在通过clang-format保存自动格式化时,函数的括号风格老是变化,一会是后置风格,一会是另起一行,如下所示:
风格1:

void fun(void){

}

风格2:

void fun(void)
{

}

本人想统一为风格1,无耐在VSC的UI里面各种参数尝试无果,于是找到官网:

ClangFormatStyleOptions

找到相关的设置:

BraceWrapping (BraceWrappingFlags)
Control of individual brace wrapping cases.

If BreakBeforeBraces is set to BS_Custom, use this to specify how each individual brace case should be handled. Otherwise, this is ignored.

# Example of usage:
BreakBeforeBraces: Custom
BraceWrapping:
  AfterEnum: true
  AfterStruct: false
  SplitEmptyFunction: false

其中设置函数后括号风格的:

bool AfterFunction Wrap function definitions.

true:
void foo()
{
  bar();
  bar2();
}

false:
void foo() {
  bar();
  bar2();
}

将以上的配置添加到.clang-format 文件中,放到VSC工程的根目录下,才能生效

phpredisadmin安装

我们采用源码的方式安装:

git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git
cd phpRedisAdmin
git clone https://github.com/nrk/predis.git vendor

安装后默认是不需要账户可以浏览的,如果要设置权限,修改 include/config.sample.inc.php 中的账号内容

手动申请letsencrypt通配证书

先自行安装certbot

申请证书
“`
certbot certonly –manual -d *.yourdomain.com –server https://acme-v02.api.letsencrypt.org/directory –preferred-challenges dns-01
“`

申请完成后,根据提示的路径,自己配置nginx的证书路径就可以了。

目前这种方式申请的通配证书只支持二级域名,根域名要自己坐下rewrite处理。

目前这种方式有个问题,就是 certbot renew 时,会报错:
“`
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration. The error was: PluginError(‘An authentication script must be provided with –manual-auth-hook when using the manual plugin non-interactively.’,). Skipping.
“`
为了自动化,我们建议采用acme的方式:
https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

centos下的php7安装

  1. 设置安装源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum clean all
yum makecache fast
  1. 安装
yum install -y php71w-fpm  mod_php71w php71w-cli php71w-common \
php71w-gd php71w-mbstring php71w-mysqlnd \
php71w-xml  php71w-ldap
  1. 检查安装版本
php -v
PHP 7.1.18 (cli) (built: Jun  2 2018 08:16:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
  1. 开机启动php-fpm
    sudo systemctl enable php-fpm

腾讯企业邮箱如何设置IMAP、POP3/SMTP及其SSL加密方式

如何设置IMAP、POP3/SMTP及其SSL加密方式?

如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。

通用配置参数:
(我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)

POP3/SMTP协议
接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465

IMAP协议
接收邮件服务器:imap.exmail.qq.com ,使用SSL,端口号993
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465

账户名:您的企业邮箱账户名,账户名需要填写完整的邮件地址
密码:您的企业邮箱密码
电子邮件地址:您的企业邮箱的完整邮件地址

centos7 vsftp 虚拟用户配置

搞过好多遍了,每次都要花不少时间确认一些小问题,所以做个笔记,供以后参考
1. 安装 vsftpd
yum install vsftpd
chkconfig vsftpd on
2. 测试端口外网可访问性,用telnet就可以测试,如果不可访问,请确认vsftp端口已经监听,并且iptable 或者firewall配置正确,同时如果用的是阿里云之类的云主机,确认云平台的安全策略是否已经开发21端口
3. 创建用户
useradd virtual -s /sbin/nologin
4. 修改/etc/vsftpd.conf
修改:
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
新增:
guest_enable=YES
guest_username=virtual
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_conf
5. 修改 /etc/pam.d/vsftpd,删除原有内容,新增:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
6. 创建账号
1)创建账号文件 login.txt:aaaa是密码,1111是密码
aaaa
111111
2)  db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db
7. 创建虚拟账号
mkdir  /etc/vsftpd/user_conf
vi aaaa
编辑内容,注意虚拟账号的目录一定要在默认user loc目录下,默认目录是/var/ftp/
local_root=/var/ftp/aaaa/
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
8. 配置完成重启服务
systemctl restart vsftpd

Apollo mcu的flash写入函数am_hal_flash_program_info异常

参考系统给的样例,封装了写入函数:

int usr_write_config_to_flash() {
  int ret;
  U32 offset = 0;
  // do {
  // 写入前要先擦除块
  info_block_erase();

  // 写入配置数据
  memset(flash_write_buf, 0, sizeof(flash_write_buf));
  memcpy(flash_write_buf, &sys_config, sizeof(sys_config));
  offset = 0;

  ret = am_hal_flash_program_info(AM_HAL_FLASH_PROGRAM_KEY,
                                  0, // we are only supporting INFO on instance 0.
                                  flash_write_buf,
                                  offset / 4,                    // offset
                                  (sizeof(sys_config) + 3) / 4); // num words
  //} while (ret);

  if (ret) {
    log(ERR, "am_hal_flash_program_info at offset 0x%08x i32ReturnCode = 0x%x.\n", offset, ret);
    return ERROR;
  }
  log(RUN, "flash write success\r\n");
  return SUCCESS;
}

系统的样例是正常的,因为没有别的业务逻辑,我的代码在开机执行也是正常的,但是在业务中调用 am_hal_flash_program_info 函数时就会随机失败,开始一直怀疑是地址区段的问题,各种尝试都不行,后来看函数的原型,发现下面的文字说明,才恍然一惊:

 

看到蓝色标识的部分,才想到是不是被系统的定时器中断影响了,因为系统起来后开启了很多定时器中断,于是在擦除和写入的逻辑区间关闭了中断,于是就没有再发现失败了。

浪费了半天时间,惭愧,特此随记,以示教训:在没有相关文档的情况下,要仔细看函数原型的任何一行说明文字

VSC下clang-format的自动格式化配置

遇到的问题:clang-format  启动自动格式化后,每次自动换行的宽度太窄,导致大量的自动换行,影响代码美观。

解决:

以默认的.clang-format 配置文件为模板,修改ColumnLimit参数:

Language: Cpp
ColumnLimit: 120

最后将.clang-format  文件放到工程的根目录下,重新开启VSC,生效。
其中 Language的设置如下:

Language (LanguageKind)
Language, this format style is targeted at.

Possible values:

LK_None (in configuration: None) Do not use.
LK_Cpp (in configuration: Cpp) Should be used for C, C++.
LK_Java (in configuration: Java) Should be used for Java.
LK_JavaScript (in configuration: JavaScript) Should be used for JavaScript.
LK_ObjC (in configuration: ObjC) Should be used for Objective-C, Objective-C++.
LK_Proto (in configuration: Proto) Should be used for Protocol Buffers (https://developers.google.com/protocol-buffers/).
LK_TableGen (in configuration: TableGen) Should be used for TableGen code.
LK_TextProto (in configuration: TextProto) Should be used for Protocol Buffer messages in text format (https://developers.google.com/protocol-buffers/).

相关的选项含义可以参考这里:http://releases.llvm.org/3.6.0/tools/clang/docs/ClangFormatStyleOptions.html

ios之multipath TCP

之前研究过这个,今天有人问起,回想了半天才想起来具体的技术细节,所以作下简要笔记,已备下次回顾之用。

在IOS7以后的版本中,当iphone连接硬件wifi热点,跟硬件建立tcp socket连接时,怎么才能同时保证可以通过手机自身的4G上internet,在android上这个是做不到的,但iphone可以,这场景就用到multipath TCP。

具体细节可以参考这个 http://www.cnblogs.com/yulang314/p/5065305.html

2017年终总结

2017像以往的任何一个年头一样,在挣扎和匆忙中过去了。
一月的时候,女儿出生了,令我无比幸福,因为只能和妻子两个人来照看孩子,有了孩子后,老婆性情大变,也开始了我结婚以来的抑郁时刻(我们相识10年,结婚6年)。
三月的时候我的母亲意外车祸去世了,我无比痛苦,开始时常会一个人默默流泪,想念我的母亲或者曾经的某刻时光,我感觉自己抑郁了,或者这本身只是老了的一种表现,我不得而知。
年底左右的时候,借钱和贷款买了地铁口的小产权,不知道是生活的一个进阶还是屈服,然而这个喜悦丝毫不能让我从老婆带来的抑郁中走出来。
由于只能我们两个抚养小孩,我上班她全职,再加上她对小孩近乎变态的怜爱和呵护,这让他筋疲力尽,异常暴躁,而我看在眼里,也只能默默忍受这一切的改变,毕竟她是为了女儿,而我因此要责怪她或者女儿,显然不可能。也许这是人生的必经阶段,也许这是婚姻的不可避免,我无可选择。
因为母亲去世,要打官司赔偿,只能把工作辞掉,准备做好持久战的准备,所以在处理完母亲的事故后,四月底重新入职到了现在的公司。
因为是曾经的同学的极力邀请,所以在据掉了一家以色列的初创公司后,开始了一年多的开发历程。
昨天还收到那个以色列公司的创始人的微信拜年,感觉时光匆匆。
目前的公司是北京公司的深圳分部,也就是初创公司,入职的时间也是新公司的注册成立时间,前期就几个主力人员,基本每个人负责一款独立的产品或者软件。
先是四月开始,要完成一款路由器的开发,因为以往软硬件的积累以及linux的开发经验,很快就从零开始完成一款基于openwrt的行业设备的软件开发,其中一半多的时间是梳理需求和设计业务场景和平台通讯接口协议,开发和测试差不多一半时间。但是因为商务订单的问题,这款演示和测试完成后就暂停了。
这期间,因为大家都没有开发过微信公众号,因为自己有后台开发的经验,就一个人主动承担了公司的微信服务公众号的后台开发,基于php的,一个多月就完成了设计和开发,期间为了按计划完成,取消了提前两个月预定的十一探亲机票,还好按计划完成,也算不枉取消机票的损失。但完成自我目标的喜悦完全可以忽略金钱的损失,内心很高兴。完成项目后,请假一周,回家探亲,让父亲看了下他的孙女,父亲不善言语,但知道他看到孙女很高兴。
11月的时候公司因为想争取一个NBIOT的项目,承诺快速给客户演示样机,又进入到了加班加点的样机开发中,后面还出差成都一周进行现场测试,实测下来NB在做定位tracker方面,目前的芯片方案和运营商服务还不是很成熟,后来测试完了后,因为还达不到GSM的移动稳定性,同时客户也是没有实际的业务订单,也只是想看看NB的效果,所以也只能暂告段落。
完成NB的演示后,就进入了政府的牧场项目中,目前的北京总公司资源很丰富,项目真多。这个项目是和内蒙政府做牧场的牲畜定位追踪和食品安全追溯系统。加班加点的在1月25完成第一期的实地场测。签署了第一批350万的订单,然后就紧接着迎来的农历新年放假。据说放假前,公司拿到了项目款,算是总算干了一个进账的项目吧。
放假期间要完成以下的任务:
1.整个系统的需求文档,因为我是整个项目的产品经理,所以需要统筹整体方案(硬件,平台,app)
2.产品的几个相关app原型和交互设计,年后主要做app的产品经理,将基本完成的硬件firmware的代码交接给其他开发同事。
3.现有硬件fireware的概要设计和详细设计
回来的路上开始看“创业维艰”,今天终于看完了,算是对这几天闲暇愧疚的一个慰藉吧,这是一本很好的书,希望有空能单独写一篇读书笔记。
还有一个小小的喜悦是拿到了驾照,工作这么多年来,一直都很忙,创业和上班,没有时间,今年因为考虑小孩的未来需要,终于下决心抽空把驾照考了。
这几天每天都是吃吃吃,每天都有相邻和亲戚来串门或者拜访,不得闲暇,今日有空,故记录流水账,以慰愧疚。

总的来说,因为自己做事的风格以及对自己的要求,工作都很忙,但今年格外忙,在加上母亲的意外和孩子的出生,2017是我人生中最煎熬的一年,希望未来越来越好。
特别感谢一直以来支持的朋友,如果没有你们一直以来的支持和关心,我可能在抑郁和压力中作出令人不敢想象的决定,在这里默默谢谢你们,也祝你们未来越来越好。

STM8 IWDG看门狗的使用说明

好久不搞stm8了,但朋友请教,还是帮忙确认下。主要是确认STM8的看门狗用法和喂狗时间问题,网上大把的代码样例,但是还是要刨根问底弄清楚细节,才可以用,否则就是埋雷。

大概的调用样例代码:

#define SYS_IWDG_OPEN        IWDG_KR=0xCC;
#define SYS_IWDG_FEED        IWDG_KR=0xAA;

void SystemIWDG_Config(void)   
{
    CLK_ICKCR|=S3;
    while((CLK_ICKCR&S4)==0);
    //STM8单片机需先执行0xCC指令,即先打开IWDG模块,否则IWDG工作不正常
    IWDG_KR=0xCC;                //启动看门狗
    IWDG_KR=0x55;                //使能模块访问
    IWDG_RLR=0xFF;               //溢出时间
    IWDG_PR=0x06;                //256分频 38000/256=148HZ T=6.7ms    
    IWDG_KR=0xAA;                //装载IWDG->RLR
}

代码的解释请参见以下的网络内容:

STM8独立看门狗介绍

独立看门狗模块可以用于解决处理器因为硬件或软件的故障所发生的错误。它由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,因此即使是主时钟失效时它仍然照常工作。

  • 独立看门狗功能说明
    图24是STM8独立看门狗模块的功能框图。
    当在键寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就被启动了,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号(WDG RESET)。
    使用IWDG_PR和IWDG_RLR寄存器配置独立看门狗。IWDG_PR寄存器是用于选择驱动计数器时钟的预分频系数。每当KEY_REFRESH的数值(0xAA)写入到IWDG_KR寄存器时,独立看门狗将用IWDG_RLR的数值刷新计数器的内容,从而避免了产生看门狗的复位。
    IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改它们前,需首先在IWDG_KR寄存器写入KEY_ACCESS代码(0x55);在IWDG_KR写入0xAA将恢复写保护状态。

STM8_蜂鸣器功能图
(图24:STM8独立看门狗框图)

  • 硬件看门狗功能
    如果在IWDG_HW选择字节中使能了硬件看门狗的功能,在芯片上电时看门狗的功能被自动开启,如果软件不能及时操作键寄存器,则在计数器达到0x00时产生复位。关于选择字节的内容请参考数据手册中的说明。
  • 超时周期
    超时周期由计数器数值和时钟预分频器决定,下表列出了它们的数值。


(表26:STM8看门狗超时周期(假定计数器时钟为64kHz) )

键寄存器(IWDG_KR)

地址偏移值:0x00
复位值:未定义

STM8_键寄存器(IWDG_KR)

位7:0 KEY[7:0]:键值
软件必须在规定的时间内写入KEY_REFRESH数值,否则当计数器数值达到0时,看门狗会产生一个复位。
KEY_ENABLE数值=0xCC
写入KEY_ENABLE数值将启动IWDG。
KEY_REFRESH数值=0xAA
写入KEY_REFRESH数值将刷新IDDG。
KEY_ACCESS数值=0x55
写入KEY_ACCESS数值将允许对受保护的IWDG_PR和IWDG_RLR寄存器的操作

预分频寄存器(IWDG_PR)

地址偏移值:0x01
复位值:0x00

STM8_预分频寄存器(IWDG_PR)

位7:3 保留,必须保持为0。
位2:0 PR[2:0]:预分频系数
这些位是写保护的。它们用于指定对计数器时钟分频的分频系数。
000:分频系数=4
001:分频系数=8
010:分频系数=16
011:分频系数=32
100:分频系数=64
101:分频系数=128
110:分频系数=256
111:保留

重装载寄存器(IWDG_RLR)

地址偏移值:0x02
复位值:0xFF

STM8_重装载寄存器(IWDG_RLR)

位7:0 RL[7:0]:看门狗计数器重装载数值
这些位是写保护的(见14.2)。每次在IWDG_KR寄存器中写入0x
被传送到看门狗的计数器中,看门狗的计数器将重新从这个值开和时钟的预分频系数决定,见表26。

IWDG寄存器映像和复位数值


(表27:STM8 IWDG寄存器映像 )

 

官方手册原始内容,124页:

http://www.st.com/content/ccc/resource/technical/document/reference_manual/9a/1b/85/07/ca/eb/4f/dd/CD00190271.pdf/files/CD00190271.pdf/jcr:content/translations/en.CD00190271.pdf

本地下载备份:en.CD00190271

根据芯片手册中时钟的配置:

文章开头样例代码的看门狗最大喂狗时间大约1.725秒(38K时钟)

xcrun导致的pod更新失败

系统升级到最新的sierra后,执行pod update 失败:

zcj-macair:qinmi alex$ pod update
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
zcj-macair:qinmi alex$ brew install ryby
Updating Homebrew...
==> Using the sandbox
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: git cannot be built with any available compilers.
Install GNU's GCC
  brew install gcc

Error: Git must be installed and in your PATH!
Error: No available formula with the name "ryby" 
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
Error: No formulae found in taps.

按照提示安装对应的程序时,进一步提示错误,发现是xcrun错误。

更新xcrun环境:xcode-select –install
更新ruby:brew install ruby
更新pod:gem install cocoapods

openwrt中添加mt7628an对sim7600ce的支持

按照模块的使用手册,我们知道设备的usb会虚拟出5个串口设备。
在openwrt中默认是支持usb转uart的驱动的,默认是可以支持此设备的,我们只要在menuconfig中选择相应的开关就可以完成支持

Kernel Modules → USB Support
<*> kmod-usb2
<*> kmod-usb-ohci
<*> kmod-usb-serial
                <*> kmod-usb-serial-option
                -*- kmod-usb-serial-wwan
<*> kmod-usb-core

ssh强制密钥登陆

在网路上有大量的扫描程序和爬虫在扫描肉鸡,其中一个最常用的方式就是扫描ssh权限。这种肉鸡主要用来【翻腔】或者DDOS或者挖矿等,总之是可以牟利的。

新注册的vps,还没多久就发现:

There were 2816 failed login attempts since the last successful login.

而避免被暴力的一种简单的方法就是强制密钥登陆。

  1. 创建密钥对
    ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
    按照流程走完后会在 ~/.ssh目录下看到id_rsa, id_rsa.pub文件 第一个是私有密钥 第二个是公有密钥。
  2. 将公钥的*.pub内容写入:.ssh/authorized_keys
    如果没有目录创建目录。
  3. 修改服务器配置 /etc/ssh/sshd_config
    PasswordAuthentication no 默认yes,改为no。是否允许使用基于密码的认证。
    (建议但非必选)
    GSSAPICleanupCredentials yes 默认no,改为yes。是否在用户退出登录后自动销毁用户凭证缓存
  4. 修改完后重启sshd服务
然后私钥就可以用来在客户端登录时使用,如果密钥没密码,就可以实现无密码登录了