excel公式实现:根据当前单元格偏移位置引用计算

根据当前单元格偏移位置引用计算

直接上公式示例

=INDIRECT(ADDRESS(ROW()-1,COLUMN()))

作用:引用当前单元格上一行同列的值。
原理:自己查excel自带帮助的公式说明。
特点:可以无脑的将该公式粘贴到任意位置,即做相对引用,不受表格其他内容、位置的影响。
使用场景示例:如下图所示,尾行是计算周变化值/比例。选中格事实就是=B706-B698。每周会插入8行数据。使用了上面偏移位置方案,就不用每次更新下面公式,省心且不出错。

(个人探索)卸载windows 10自带应用方法

windows10自带了很多应用,说实在的,实在烂得让人失去吐槽的兴趣,卸载是最好的对策。网上有一些卸载方案,比如google搜索出的这两篇

感觉这里的方案有点简单粗暴,不够优雅。突然发现了一个更好的办法,利用windows任务管理器,只卸载让你感到恶心的那些“应用”。

方法如下:

  1. 如果你发现某个恶心的“应用”被打开了(比如双击打开某个视频文件后,打开了“电影与电视”),先不要关闭它。
  2. 打开windows任务管理器,进入“进程”选项卡,在“应用”一组里,找到上述应用,点右键 - 属性
  3. “属性”对话框的“常规”选项卡里的“位置”一项,是一个路径,形式如 C:\Program Files\WindowsApps\***** 最后一级目录(即前面星号代替部分)就是应用的包名,将包名复制到剪贴板
  4. 以管理员身份启动Powershell(可以在开始菜单里找到 Windows Powershell,点右键 - 以管理员身份运行),运行 Remove-AppxPackage 包名
  5. 完成。

这样就只卸载你不需要的那些应用。

 

MacPorts简介及日常应用与维护/mac port

MacPorts是在mac osx下的软件包安装系统,包含了一系列Unix/Linux工具、软件包等。同类软件还有HomeBrew。macPorts的优点之一是,它把所有软件安装到一个固定目录下,与osx本身完全隔离,不造成混乱。

安装MacPorts

 

有用知识

macports默认安装到/opt/local下

安装、卸载、升级装软件

安装软件:普通用户下运行 sudo port install {包名}   ;或者先sudo su切换到root用户下直接执行port install {包名},下面皆省略sudo 。

卸载软件:port uninstall {包名}      (其中包名)

更新软件:port upgrade {包名}

全面升级:port upgrade outdated

全面升级前,通常需要对macport自身升级(port会提示你的):port selfupdate

关于port下包名:指定版本号时包名会带空格,这时不要用引号括起来(括起来反而不认,这与bash习惯很不同),示例  port info gettext @0.19.3_1

其他有用命令

查看帮助:port help {子命令名}        (例如:port help search)

列出当前安装过的包:port installed          (注意不要用 port list installed,原因)

列出可用包:port list          (即可以通过port install安装的包)

搜索包:port search {关键词}          (有很多参数,port help search查看或文档

查看软件包介绍: port info {包名}

查看依赖包:port deps apache2

清理安装包时的临时文件:port clean {包名}    (注意不是卸载,更多参考

升级软件包时带-u参数可以同步清理旧软件包 port -u upgrade outdated

清理MacPorts里的老旧包、无用文件等

使用过一段时间后,/opt/local会变得很大(可通过 du -sh /opt/local 查看占用大小),这主要“得益于”(归罪于)port更新包时保留旧版。定时清理一下好了。

  1. 清理编译文件等 port clean --all installed
  2. 清理老旧包 port uninstall inactive

事实上这并不能让 /opt/local 变小很多,因为里面还有很多下载的源码 /opt/local/var/macports/sources/release/ 可以进去手工清理一下

某商vps上编译php时报错“undefined reference to `libiconv_open'”的处理

帮朋友的阿里云的服务器装wordpress。该服务器上面已经装了有好几个站点,web环境是wdlinux的所谓一键安装脚本,向来极其厌恶这种所谓的一键脚本,版本老化,目录不合理,乱。但为了兼容现有环境,还是决定在它上面继续。无语的是,这个web配置实在乱透了,nginx作前端,把动态请求反代到后方apache上,这样配置一个web站点,要同时设置两套web。而且还是使用php 5.2.17,这个老掉牙的版本!搞了半天,真心不想搞下去了。于是决定新安装php新版本,以php-fpm运行,简洁优雅地在nginx上跑。

之前自己服务器上路的是php 7.0.9,直接下载这个版本源码,使用之前自己的configure参数,但在make时出错了,错误消息第一行非常长,核心就是iconv有问题

undefined reference to `libiconv_open'

尝试安装iconv-devel等办法都使用了,都不行。

经过google,也有别的朋友遇到同样问题,make时加参数即可,如下:

 make ZEND_EXTRA_LIBS='-liconv'

堪称完美,在所有解决方案里最简便,向该博客作者表示感谢。 继续阅读

windows下安装zip压缩版的mysql服务器端v5.7.16

环境:windows 10某个版本(写本文的最新版本)

目的:安装个mysql服务端,从官方下载的zip压缩版5.7.16,而不是msi版本。

操作过程折腾了,以前安装过多次,不过好像不是真正意义上的从zip安装,而是使用之前通过msi安装过的版本,后面只是注册成系统服务一项。

本次折腾的的操作,主要从官方是下载.zip版本压缩包,选择的是x64版,解压缩到合适的目录里,本文以 C:\Program Files\mysql\  为例。

step 0. 准备配置文件:复制my-default.ini得到my.ini ,修改其中的basedir, datadir两个参数,示例如下

basedir = C:\Program Files\mysql
datadir = D:\data\mysql-data

step 1. 安装为windows服务:管理员身份启动cmd,进入mysql/bin/目录,执行如下安装命令:

mysqld --install MySQL --defaults-file="C:\Program Files\mysql\my.ini"

注意:--install 参数必须在前,否则mysqld会认为你要运行mysqld进程,然后启动失败)

setp 2. 初始化数据目录:创建 D:\data\ ,注意不需要创建mysql-data子目录;运行 mysqld --initialize

step 3. 查root用户初始密码:查windows日志-应用程序日志,里面应该有类似如下一条

A temporary password is generated for root@localhost: 5cuiMezaNd>QFor more information....

其中5cuiMezaNd>Q即是默认密码,到命令行里修改一下吧,如下一行,将root密码改为000111, 会有交互提示输入旧密码的。

mysqladmin.exe -uroot -p password "000111"

step 4. 启动windows服务:net start MySQL. 完工。

Addition. 如需要卸载服务,到mysql/bin/目录里执行 mysqld.exe --remove 即可。需要的话删除mysql数据文件目录。

MySQL复制设置及相关维护操作

1. 主库服务器配置

主服务器MySQ配置参数,参数主要依据《高性能MySQL 第三版》

#replication safe for innodb engine
innodb_flush_logs_at_commit
innodb_support_xa=1


#replication
server-id=100
log-bin=mysql-bin
log-error=mysql-bin.err
expire_logs_days=30
sync_binlog=1

2. 添加复制用户

只需要赋两个全局的权限: REPLICATION SLAVE, REPLICATION CLIENT

CREATE USER 'repl'@'192.168.10.132' IDENTIFIED BY '***';
GRANT REPLICATION SLAVE , REPLICATION CLIENT ON * . * TO 'repl'@'192.168.10.132' IDENTIFIED BY '***';

3. 备份主库,备份中加入binlog及位置

全面备份主库,备份前需要已经启用二进制日志。

mysqldump -hlocalhost --opt --master-data=1  --all-databases --max_allowed_packet=8M --net_buffer_length=128K -uroot -pyour-password >all.sql

为了获得一致性的备份,考虑加入参数--single-transaction 或 --lock-all-tables,分别针对事务型引擎及非事务型引擎,但它们不能同时使用。

注意其中--master-data=1参数,它将binlog及位置信息生成到备份文件中,大概如下一行

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=8747725;

4.iptables放行备库连入

针对从服务器ip到本地3306端口的连接

iptables -I INPUT 7 -s 192.168.10.132/32 -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

5. 配置从服务器

server-id=201
log-bin=mysql-bin
relay_log=/var/lib/mysql/mysql-relay-bin
log_slave_updates=1
expire_logs_days=30
read_only=1

6. 还原到从库服务器上

SOURCE /path/to/bakup.sql;

6. 配置从库,连接到主库

事实上下面的log_file,log_pos可以不用再指定,因为备份里已经有该信息并还原到这里了。当然再指定一次也没负作用。

change master to master_host='192.168.10.100', 
master_user='repl',
master_password='repl-password', 
master_log_file='mysql-bin.000004', 
master_log_pos=8747725;

7. 启动slave

start slave

完成

x. 如果异常,复制失败时,或许需要重配置slave才可以解决问题

 

stop slave;
RESET SLAVE;
SOURCE /path/to/bakup.sql;
RESET SLAVE;
change master to ...
show slave status; #检查状态,确认主库及连接账号等
START SLAVE;

附记注意事项:

  • 关于binlog_format 参数。在mysql 5.5(win32)版下,该参数默认值为STATEMENT。于是,至少有以下问题insert into tablename select ... limit n这样的语句,执行时会报warning错误,原因是limit结果在一致性上是非安全的。

end

本博客正式支持HTTPS/SSL浏览(powered by Let's Encrypt)

今天起,本博客已经正式启用https/ssl,页面上链接已经更新为https链接。

使用的是Let's Encrypt提供的免费ssl证书服务。

Let's Encrypt服务优势

免费、支持多域名、国际化,并且服务商是Linux基金会成员,可信度高。

目前主流浏览器都支持该证书的,参看官方的“证书兼容列表”

负面影响评估

以GA上最近1万(准确数字是10523)次会话作样本做评估,GA只计算“人”的访问,而不计蜘蛛,这更符合现实。(可以认定,主流的搜索引擎蜘蛛应该是支持该证书的,这个影响按理可以忽略。)

按网友的经验IE6是不支持的,经过虚拟机下windows 2003里IE6测试证实了这一点(手上没带IE6的xp)。样本会话中共计10次IE6,9次IE7;由此IE6占比不到0.1%即使带上IE7,也不到0.2%. 因此旧版IE可以忽略。

Safari 4.0以下无访问。

 

Let’s Encrypt HTTPS证书申请部署与自动续期/免费ssl,nginx,centos

一年半以前曾经买过一个廉价的https/ssl证书,部署在本博客blog.path8.net上,时间大概在 2015-5-17,然而并没有正式启用,以至于过期也都没有注意。前几天想于把这个事情搞起来。以前的经验是,廉价ssl证书都是只对一个域名有效,但竟然发现Let's Encrypt的免费证书,还是多域名的。近一年的新文章里,有不少人对之大加赞扬;于是准备试试。同时也发现了腾讯云也有免费ssl证书,单域名的,免费一年,试用了一下,签发速度比较快,部署到本站上。不过还是决定使用Let's Encrypt。下面是简单记录。

vps环境CentOS 6.x, niginx

花了半天时间研究Let's Encrypt的相关文章(基本都是中文博客),另外尤其仔细读了其官方网站,开始实际操作,发现真的很简单。

ssh登录到服务器上操作,并且操作需要需要root权限。

1. 自动部署脚本需要epel源,如果之前没有安装先安装之 yum install epel-release

2. 在线获取签署脚本(按自己的习惯保存到合适目录)。签署脚本官方称之为客户端,有多个版本,这里使用的官方推荐的 certbot

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

3. 运行签署脚本。脚本里注意两人参数 -w, -d,分别是一个web目录及该目录对应的域名;多组目录就多次指定。这里只是获得证书文件,不做自动部署。(猜测是因为该脚本不支持nginx的自动部署,毕竟nginx不在centos官方源里,不同服务器上安装方式 不一样)。如下所示。

./certbot-auto certonly --webroot \
-w /var/www/html/blog.path8.net/html -d blog.path8.net \
-w /var/www/html/www.path8.net/html -d www.path8.net -d path8.net -d fengyqf.com

4. 接下来会自动通过yum安装几个依赖包,同意即可。

5. 然后是几步交互式对话:邮箱地址、同意条款、照着操作即可。因为Let's Encrypt是自动签署,速度非常快,大概整个过程只花费了两三分钟(包括交互过程里等待用户操作的时间)。

letsencrypt_req_email

交互询问邮箱地址

按其他网友的文章所说,使用国内dns服务很容易引发域名解析失败;此次使用dnspod却是一次成功的。成功后消息如文后。

在目录里 /etc/letsencrypt/live/{your.domain.ext}/ 得到四个文件:cert.pem chain.pem fullchain.pem privkey.pem  。简单理解,前两个是给Apache用的,后两个是给Nginx用的。(注意 privkey.pem 这个文件是私钥,内容千万要保密!)

事实上这四个文件是到/etc/letsencrypt/archive/{your.domain.ext}/ 下文件的符号链接。从结构上看,更新证书时,会自动更新符号链接目标。

按脚本执行的输出,运行日志记录在 Saving debug log to /var/log/letsencrypt/letsencrypt.log

下面是签署脚本成功执行后的消息。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/blog.path8.net/fullchain.pem. Your cert will
   expire on 2017-01-14. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to f***@gmail.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

6. 部署证书文件到nginx上。主要是ssl_* 的行,指定为证书目录。

    server {
        listen 80;
        listen 443;
        ssl on;
        ssl_certificate  /etc/nginx/ssl/blog.path8.net_cert.crt;
        ssl_certificate_key  /etc/nginx/ssl/blog.path8.net.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
                index  index.html index.htm index.php;
                # from nginx.org rewrite rule
                # This is cool because no php is touched for static
                try_files $uri $uri/ /index.php;
        }
    ......
    }

7. 重新加载nginx配置,或者重启 nginx -s reload  ,然后测试https访问。记得iptables放行443端口。

8. 如果需要,将80端口301重定向到443.

9. 配置定时任务以自动更新证书。重新签署证书及加载证书,将脚本加入到定时任务中,/path/to/certbot-auto renew --quiet  . 重新加载nginx配置以应用新证书的脚本如  nginx -s reload

凭空想象的应用中的数据加密方案

限制单用户单位时间内最大请求频次

(如每日最多请求50次内容页){仅稍微增加了采集难度,延缓被脱库时间}

对于请求频率异常的设备,封禁若干长时间(如10分钟)

技术方案参考:

  • App在请求接口时,带上设备惟一编号、当前版本号
  • 请求异常时,将设备惟一编号列入黑名单。
  • 设备惟一编号。可以使用友盟统计的 Device Token。<Tips:惟一编号方案不要与苹果的隐私规范冲突>(注意:Android可以通过清空应用数据重置该惟一编号,iOS可通过卸载后重装重置该编号)

加密数据输,请求及响应双向加密。

至少要包括:接口名,参数名,参数值。可以考虑如下加密方案:

  • 使用AES加密算法,AES密文是二进制的,最好再做一次BASE64编码。
  • 通过接口分发密钥,密钥本身也是加密传递,真实密钥需要是经过事先约定的算法计算得到。
  • 不要通过单独的接口分发密钥,而是放在其他接口中,可以放在最低允许的版本号的接口中。响应数据中,增加适量无意义的干扰信息,增加猜解难度。
  • 密钥定期修改,在服务器端更改,App启动时加密分发给App。
  • 在做协议分析时很容易猜解接口名,因此接口名可以采用另外的密钥加密,与数据传输密钥不同。可以是硬编码到App内部的固定密钥。
  • 参数名、参数值放在一起加密,即通过GET请求字符串整体加密。
  • 服务器端响应数据,也是加密后base64编码后返回密文。
  • 固定密钥不要直接出现在App的字符串资源中。

一个接口格式参考

也可以将接口地址格式改成这个形式:

host.domain.ext/interface?model=news&action=list&class=123
host.domain.ext/interface?model=news&action=detail&class=9876

将get参数加密传输后格式示例(下面只是简单的base64,没做加密)

host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM
host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249ZGV0YWlsJmNsYXNzPTk4NzY

甚至把interface一段也重写隐藏掉,形式如

host.domain.ext/bW9kZWw9bm3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM

对于POST请求,将post包与做类似的加密封装

其它杂项

一个接口:最低允许的版本号。作用:App启动时,检查版本号,如果App版本号过低,强制用户更新。(类似网络游戏启动时检查版本补丁的方式)

如果有在线接口文档,其地址(目录命名、目录层级等)要有一定复杂度,避免被猜到。最好是授权查阅(口令、账号、IP段等)

凭空想象的web功能开发标准(性能,负载,可用性,安全,审计等多侧面)

重要数据的变动记录,及保留历史版本

对重要数据变动,做日志记录,必要的保留历史版本。可选技术方案:将所有历史版本数据存储在k-v表中,允许随时丢失部分或全部

缓存、临时文件及日志

允许这类数据存储在易失性设备上,如内存缓存。允许随时丢失部分或全部,程序不得崩溃(鲁棒性)

自己擦屁股,自动归档旧数据,尤其是存储到数据库中的旧数据,如日志表,临时文件等。至少要有相关文档,指明哪些是此类数据,如何清理,清理是否会带来后遗症(理想 状态是可以任意删除,程序本身健壮工作)

用户行为记录

uv, pv, 类似GA ,或者直接使用第三方服务

单个用户的足迹,按用户、回话划分。登陆用户的记录很自然;非登陆用户,也要有区分方案,可以类似于app中device token的实现原理。负载均衡下要按session划分。

关键步骤的记录。

分别对待:

不产生服务器上数据变更的行为,注意是浏览、搜索等行为,类似HTTP get方法的约定。选特定行为,做记录

产生服务器上数据变更的行为。无条件记录:数据产生人,时间,源IP等必要信息。数据更改及删除,还需要记录原始数据,目标:可快捷低成本的追溯历史。

 

统计类数据

统计类数据,如文章点击量,定期快照(如按月、天、小时),或者记录一定粒度(如小时,天)时间段的统计量

防范资源滥用

高资源消化的操作做qps限制

关键请求上,针对单用户限制授权额度。这里的“用户”是宽泛概念,可以是用户账号,session, ip等多种

信息分级(信息安全层面)

防止重要信息被批量采集,将这些信息分级,对不同用户级别用户展示相应部分。初级用户只能看到极少部分。

严格限制列表页:不得查询未授权的内容,防止越权读取。

信息分级(业务层面)

不同级别的信息,有差异的对待,保证信息准确性,可追溯性等。

从生命周期对信息分类,尤其是对主体信息。这里的“主体信息”,是一个模糊概念,暂时简单的理解为:在数据库里以单独表形式存储的信息,每条信息对应一条记录。划分方式相对个人化、主观化:

  • 长期有效信息:知识,规范手册,等
  • 中长有效期:,
  • 短有效期:,
  • 即时有效期:

按信息对业务重要程度划分,

  • 重要信息
  • 次重要信息
  • 不重要信息
  • ...

 

 

账号密码管理

传统的用户名密码方式,在实际使用过程中,使用人员一定会共享账号,且密码修改非常不及时。(通常是将账号密码放在文件里,如果有工作交接,直接将文件转发,或者直接在QQ里发送账号密码。因为这比“找相关人员新开设账号、设置权限”简单太多了为了。为了不影响别人使用,所以几乎都不会改密码)然而这都是重大的安全隐患。

邮箱作账号,登录后通过邮箱做验证,避免账号共享,强迫通过管理人员赋权限。企业邮箱是第三方服务,一般有较好的密码策略。

用户在同ip段登录只验证一次,若干时间内不需要重复验证。

如果多个用户在某ip段成功验证,其他人员也可以在该ip上通免验证。

超过一定时间不登录的账号,禁止登录,需要重新邮箱激活才可。

超过一定时间不使用的权限,自动撤销。这样,通常就不需要管理员取消授权。

用户管理

对用户按权限分级,如果需要的话(普通用户登录,超级用户)。权限可以查阅、发布来划分;对于管理员,则按增删改查划分。

用户状态,在登录时有相应提示,减少用户登录时提示信息异常造成的困惑,即使对已封禁用户(制定一系列状态,如:临时拒绝登录,禁言,封禁,异常锁定等)

保护用户隐私

关于请求数据

post/get之辨

请求参数格式,url简洁,事先评估是否实现rewrite兼容性

针对移动设备的http接口请求,要实现类似user-agent信息,在请求中传递,可以在http协议头中传递

功能设计原则(底线)

不希望用户操作、不希望用户看到的东西,不要列出来

必要的说明:正确,简明,有效,隐藏

不挑战用户习惯

一致性(提示文案的一致性,同类功能操作方式一致性,UI元素摆放位置一致性,etc)

功能设计原则(价值点)

有转化,可转化

有用的参考资料

  • 信息安全标准目录 http://www.cnblogs.com/merray/p/5315066.html

 

Pages: 1 2 3 4 5 6 7 8 9 10 ... 45 46 47 Next