以”查看本地端口占用情况”为契机学习一下 netstat
命令。在 man netstat 中的介绍,netstat 可以打印网络连接,路由表,接口信息,masquerade 连接,多播信息的工具。
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
直接运行以下命令可以打印出当前系统上所有开放的端口(包括 TCP,UDP 端口),进程等等信息
sudo netstat -tupln
-l
will list listening ports 列出所有在监听的服务端口-p
will display the process-n
will show port numbers instead of names 尽量显示数字-t
to show TCP ports-u
will show UDP ports其他常用参数
-a
显示当前所有连接-r
显示路由信息-e
显示扩展信息-s
按照各个协议进行统计输出结果中,各个字段的含义
字段 | 含义 |
---|---|
Proto | 连接使用协议,主要有 TCP 和 UDP,TCP 用来可靠传输,一般用来传输网页,下载文件,而 UDP 在可能丢包的情况下提高了速度,通常用在速度优先的游戏或者直播中 |
Recv-Q | 接受队列,等待读取的数据包队列 |
Send-Q | 发送队列,此队列和上面接受队列一般都为 0,如果不是则表示队列中有正在处理 |
Local Address | 本地地址和端口,显示连接的 host 和 ports |
Foreign Address | 网络地址 |
State | 显示套接口当前状态,TCP 协议定义的状态包括,LISTEN,等待外部电脑连接我们,ESTABLISHED 已经建立通信 |
PID/Program | 当前网络的 PID 和进程名字 |
返回中的状态说明:
-a
选项会列出所有连接
netstat -a
列出所有 tcp 端口
netstat -at
列出 udp 端口
netstat -au
网络服务的后台进程都会打开一个端口,用于监听请求,使用 -l
参数列出正在监听的网络端口
netstat -l
-l
只会显示监听的端口,不会显示连接
只列出所有监听 TCP 的端口
netstat -lt
同理,只监听 UDP 的端口
netstat -lu
-p
选项会打印出进程的名字
sudo netstat -p
需要注意 -p
选项使用 root 运行,大部分网络服务都需要 root 运行
netstat -c
-n
选项禁用域名反向解析,打印的结果中将只会有 IP 地址
netstat -ant
除了打印基本的网络信息,netstat 也可以打印路由表
netstat -r
输出结果演示:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.235.155.1 0.0.0.0 UG 0 0 0 eth0
10.0.85.0 * 255.255.255.0 U 0 0 0 outline-tun0
10.235.155.0 * 255.255.255.0 U 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
172.18.0.0 * 255.255.0.0 U 0 0 0 br-bcb55debff13
解释:
0.0.0.0
,匹配任何地址*
(asterisk) 则表示 send locally
发送给本机netstat -i
如果需要更加详细的信息可以添加 -e
netstat -ie
那么此刻打印的内容就和 ifconfig
一样了
如果网络遇到异常,可以每秒打印一次
netstat -ic
netstat -nap | grep 2181 | grep ESTABLISHED | awk -F 'ESTABLISHED ' '{print $2}' | awk -F '/' '{print $1}' | sort | uniq -c
netstat -an|grep '10.108' |awk '$5~":6.."' |grep ESTABLISHED |awk '{print $5}' |sort |uniq -c |sort -n
记录一下 Linux 下 Sogou 输入法失效的问题,以及解决修复过程。 Linux 真是太难折腾了,一些配置总是太乱,没有文档,没有集中的 Q&A ,导致使用过程非常困难,一些基础设施都很难用。当然如果调教的好,也是能够非常高效的。比如解决了这个基础打字问题之后的这篇文章就是在 Linux Mint 下完成的。
不知道是系统升级还是因为输入法升级,(可在我印象中完全没有做任何干扰到输入法的事情),搜狗输入法 Linux 版,就这么挂掉了,而其他设置一切正常,其他的输入法也都一切正常,但是实在无法用的过来, RIME没有一个可更新的词库,google pinyin 也是词库不全,使用起来总还是不太方便,虽然 sogou 输入法在 Linux 下有些问题所在,但是还是相对来说比较好用的,但是它就这么挂了。
在刚开始的时候以为是 Fcitx 的问题,卸载 sudo apt remove fcitx
,重装,登入登出好几回,发现并没有任何用,期间也尝试使用过 iBus,但是实在无法使用。
最后在网上查阅问题的时候,发现 搜狗输入法在系统的 ~/.config
下会有三个配置文件夹,包括
将此三文件夹,移动位置,或者删除,重新安装搜狗输入法,登出,登录,即可。
Java 中的注解,也被称为元数据,注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
@Override
常用的注解 @Override
等等就略过,如果注解有 annotation type element declarations,可写成:
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }
或者省略
@SuppressWarnings("unchecked")
void myMethod() { ... }
如果没有 annotation type element declarations,括号也能省略。如果遇到
@Author(name = "Jane Doe")
@Author(name = "John Smith")
class MyClass { ... }
这样的形式,这是 Java 8 引入的新的 Repeating Annotations 注解。
注解可以在定义时使用,包括类定义,field 定义,方法定义时。 Java 8 之后,注解也可以用在下面这些情况:
类实例化时
new @Interned MyObject()
强制类型装换时
myString = (@NonNull String) str;
implements 语句
class UnmodifiableList<T> implements
@Readonly List<@Readonly T> { ... }
抛出异常时
void monitorTemperature() throws
@Critical TemperatureException { ... }
这种类型的注解叫做 type annotation,更多信息可以在这里 查看。
看上去很像接口,下面是 JDK 中自带的 Override
注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
定义自己的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeCost {
public boolean enabled() default true;
}
注解的属性也叫做 annotation type element declarations,看起来像方法,但是不是。注解只有 annotation type element declarations,没有方法。注解的 annotation type element declarations 在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该 annotation type element declarations 的名字,其返回值定义了该 annotation type element declarations 的类型。
Java 中有如下元注解 (meta-annotation),可以理解成定义注解的注解。
注解名字 | 解释 |
---|---|
@Target | 定义的注解可以用于什么地方,比如类型上,方法上,字段上等等,详见 ElementType 枚举 |
@Retention | 在什么级别保存该注解信息,比如常见的运行时,详见 RetentionPolicy 枚举 |
@Document | 将注解包含在 Javadoc 中 |
@Inherited | 允许子类继承父类中的注解 |
@Repeatable | 表示该注解可以在同一个定义地方被多次使用 |
前四个注解是 Java 5 引入,后 Java 8 引入了 Repeating Annotations.
可重复的注解是 Java 8 引入的内容,为什么需要可重复的注解呢?举个官方文档上的例子,比如说定义了一个定时任务,有两种方式来驱动
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
亦或是在类上定义权限
@Alert(role="Manager")
@Alert(role="Administrator")
public class UnauthorizedAccessException extends SecurityException { ... }
为了实现可重复的注解,在注解定义时需要添加 @Repeatable
元注解
import java.lang.annotation.Repeatable;
@Repeatable(Schedules.class)
public @interface Schedule {
String dayOfMonth() default "first";
String dayOfWeek() default "Mon";
int hour() default 12;
}
在 @Repeating
元注解括号中需要定义 container annotation,这个 container annotation 是 Java 编译器生成用来存储可重复注解的。在例子中,container annotation type 就是 Schedules
,因此可重复注解 @Shedule
就被保存在 @Schedules
中。
定义 container annotation type 必须要包含一个 value
变量,这个变量是一个包含注解的数组。
public @interface Schedules {
Schedule[] value();
}
通过反射获取注解有很多方法,之前的 AnnotatedElement.getAnnotation(Class<T>)
方法维持不变,依然返回一个注解。或者在 JAVA 8 以后,可以通过 AnnotatedElement.getAnnotationsByType(Class<T>)
来一次性获取多个注解。
iptables
命令是 Linux 上常用的防火墙软件,是 netfilter
项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。这篇文章主要介绍 iptables
的安装,添加规则,清除规则,开放指定端口,屏蔽指定 IP,IP 段,等等基本功能。
iptables/ip6tables - administration tool for IPv4/IPv6 packet filtering and NAT
Ubuntu/Linux Mint 系系统:
sudo apt-get install iptables
iptables
防火墙用于创建过滤规则和 NAT(网络地址转换) 规则,几乎所有 Linux 发行版都能使用。 iptables 的结构 iptables
-> Tables
-> Chains
-> Rules
,简单地,Tables 由 Chains 组成,Chains 又由 Rules 组成。
iptables 具有 Filter,NAT,Mangel,Raw,security 这几种内建表:
Filter 是 iptables 默认表,内建链
三种内建链:
Mangle 表用于指定如何处理数据包,它能改变 TCP 头中的 QoS 位,5 个内建链:
Raw 表用于处理异常,具有两个内建链:
关键点:
下面是 target 中指定的特殊值:
查看已添加的 iptables 规则
iptables -t filter --list # 使用 -t 来指定表,默认为 filter 表
iptables -L -n
iptables -nvL --line-numbers
解释
-t
: 指定 table-n
:只显示 IP 地址和端口号,不将 IP 解析为域名将所有 iptables 以序号标记显示
iptables -L -n --line-numbers
在输出结果中可以看到如下字段:
常见的一些命令选项
使用 -A
命令追加新规则,其中 -A
表示 Append,新规则将追加到链尾。
iptables -A [chain] [firewall-rule]
解释:
-A chain
指定要追加规则的链下面是描述规则的基本参数
可以使用 -p
来指定规则协议,比如 tcp,udp, icmp 等等,使用 all
来指定所有协议。
另外也可以使用协议值(比如 6 代表 tcp)来指定协议,映射关系可以查看 /etc/protocols
使用 -s
来指定数据包的源地址,参数可以使用 IP 地址,网络地址,主机名
-s 192.168.1.101
指定 IP-s 192.168.1.10/24
网络地址-s
表示所有地址-d
来指定目的地址,参数和 -s
相同
-j
代表 jump to target,指定了当与规则匹配时如何处理包
可能值为 ACCEPT,DROP,QUEUE,RETURN,也能指定其他链(chain) 来作为目标
-i
代表输入接口,-i
指定了要处理来自哪个接口的数据包,这些包即将进入 INPUT,FORWARD,PREROUTE 链。
比如 -i eth0
指定了要处理通过 eth0 进入的数据包,如果不指定 -i
参数那么将处理所有接口的数据包。
! -i eth0
处理所有经由 eth0 以外的接口进入的数据包-i eth+
将处理所有经由 eth 开头的接口进入的数据包也可以使用 --in-interface
-o
代表 output interface, -o
制定了数据包由哪个接口输出,这些数据包即将进入 FORWARD,OUTPUT,POSTROUTING 链
如果不指定 -o
选项,那么系统上所有接口都可以作为输出接口
! -o eth0
那么将从 eth0 以外的接口输出-i eth+
那么将仅从 eth 开头的接口输出也可以使用 --out-interface
参数
针对 -p tcp
或者 -p udp
缺省情况下,将匹配所有端口。可以指定端口号或者端口名,比如
--sport 22
--sport ssh
--sport 22:100
# 使用冒号匹配端口范围上述关系可以再 /etc/services
文件中查阅。
同理 --dport
是指定目的端口。
比如关闭所有 INPUT FORWARD OUTPUT:
注意: 这几行命令不要轻易在服务器执行。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
使用 -N
,比如:
iptables -t nat -N SHADOWSOCKS
iptables -t nat -X SHADOWSOCKS
iptables -t nat -E SHADOWSOCKS SS
iptables -t nat -F SHADOWSOCKS
解释:
-N
新建 Chain-X
删除-E
重命名-F
删除 Chain 中所有规则清除已有 iptables 规则
iptables -F # 删除所有的规则,刷新所有链
iptables --flush # 刷新所有链
iptables -t NAT -F # 有些发行版 `-F` 命令并不会清除 NAT 表中的规则
iptables -X # 删除表中所有非默认链
允许本地回环接口(即运行本机访问本机):
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许所有本机向外的访问:
iptables -A OUTPUT -j ACCEPT
允许访问 22 端口,允许某 IP 访问指定端口,以 22 端口为例命令是:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许所有的 IP 访问 22 端口
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT # 允许 22 端口发送数据
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j ACCEPT # 允许某个 IP 访问
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j DROP # 禁止某个 IP 访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 允许 IP 段访问
允许外部访问 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许 FTP 服务的 21 和 20 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果有其他端口稍微修改上述语句中的端口号即可
允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
禁止其他未允许的规则访问
注意:如果 22 端口未加入允许规则,SSH 链接会直接断开
屏蔽单个 IP 的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
封整个段即从 123.0.0.1 到 123.255.255.254 的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
封 IP 段即从 123.45.0.1 到 123.45.255.254 的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
封 IP 段即从 123.45.6.1 到 123.45.6.254 的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
屏蔽某 IP 访问指定端口,以 22 端口为例命令是
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j DROP
要知道如何删除已添加的 iptables 规则,首先要查看规则 sudo iptables -L -n --line-numbers
比如要删除 INPUT 里序号为 8 的规则,执行:
iptables -D INPUT 8
保存生效的配置,让系统重启的时候自动加载有效配置(iptables 提供了保存当前运行的规则功能)
iptables-save > /etc/iptables.rules
恢复规则可以使用:
iptables-restore < /etc/iptables.rules
但是系统并不会在启动时自动执行该规则,所以需要在 /etc/network/if-pre-up.d/
目录中添加脚本
#!/bin/bash
iptables-restore < /etc/iptables.rules
让系统在开机时自动加载规则
iptables -A INPUT -p tcp --dport 80 -m limit --limit 30/minute --limit-burst 100 -j ACCEPT
解释:
-limit 30/minute
: 最大每个分钟 30 个连接limit-burst 100
: 用来表示只有达到这个连接数量之后才会触发 limit/minute 限制下面的例子,将 422 端口的流量转发到 22 端口,意味着 incoming ssh 连接可以从 22 端口或者 422 端口:
iptables -t nat -A PREROUTING -p tcp -d 192.168.2.104 --dport 422 -j DNAT --to 192.168.2.104:22
另外也要显示的让 422 流量通过
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
Samba,是种用来让 UNIX 系列的操作系统与微软 Windows 操作系统的 SMB/CIFS(Server Message Block/Common Internet File System)网络协议做链接的自由软件。1 Samba 能够为选定的 Unix 目录(包括所有子目录)创建网络共享。该功能使得 Windows 用户可以像访问普通 Windows 下的文件夹那样来通过网络访问这些 Unix 目录。
samba 有两个守护进程,smbd 和 nmbd,是 samba 的核心进程。nmbd 进程允许其他计算机浏览 Linux 服务器,smbd 进程在 SMB 服务请求到达时进行处理,并对共享的资源进行协调。
sudo apt install samba
启用 smb
sudo service smbd start
Samba 进程,使用 -D
参数开启守护进程。
或者
sudo /etc/init.d/samba start
smbpasswd 命令属于 samba ,能够实现添加或删除 samba 用户和为用户修改密码。
语法
smbpasswd [option] [username]
smbpasswd(选项)(参数) 选项
-a:向 smbpasswd 文件中添加用户;
-c:指定 samba 的配置文件;
-x:从 smbpasswd 文件中删除用户;
-d:在 smbpasswd 文件中禁用指定的用户;
-e:在 smbpasswd 文件中激活指定的用户;
-n:将指定的用户的密码置空。
用户名:指定要修改 SMB 密码的用户。
添加用户
首先在 /etc/passwd
中添加一条,按照此格式:用户名:密码:uid:gid: 用户描述:主目录:登陆 shell
einverne:*:1000:65534:einverne:/var:/bin/false
然后添加 Samba 用户:
smbpasswd -a einverne
修改用户密码
smbpasswd einverne
Samba 的配置文件地址在 /etc/samba/smb.conf
[global]
netbios name = OpenWrt
display charset = UTF-8
interfaces = 127.0.0.1/8 lo 192.168.1.1/24 ipv6 address/60 br-lan
server string = OpenWrt Samba Server # 服务器说明,显示了 samba 版本信息,可自定义
unix charset = UTF-8
workgroup = WORKGROUP # Windows 默认
host allow = # 可以把 ip 写全或只写前几位,表示允许访问服务端的客户端,与 hosts deny 刚好相反
browseable = yes
deadtime = 30 # This is useful to stop a server's resources being exhausted by a large number of inactive connections
domain master = yes
encrypt passwords = true
enable core files = no
guest account = root
guest ok = yes
#invalid users = root
local master = yes
load printers = no
log file = /var/log/samba/%m.log # 日志文件位置
max log size = 50 # 文件大小设置,单位是 M
map to guest = Bad User
max protocol = SMB2
min receivefile size = 16384
null passwords = yes
obey pam restrictions = yes
os level = 65
passdb backend = smbpasswd # 用户名密码存放方式
preferred master = yes
printable = no
security = user # 设置 samba 的安全等级
smb encrypt = disabled
smb passwd file = /etc/samba/smbpasswd
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=40960 SO_SNDBUF=40960
syslog = 2
strict allocate=no
use sendfile = yes
writeable = yes
large readwrite = yes
aio read size = 40960
aio write size = 40960
read raw = yes
write raw = yes
[Home]
path = /home/user # 目录
browseable = no
writable = yes # 是否可写
valid users = %S # 具有合法登陆身份的用户登陆时,家目录变为自己的家目录
# 创建了一个 Share 名为 OpenWrt
[OpenWrt]
path = /mnt/sda1 # 目录
valid users = root # 允许 root 读写操作
read only = no # 允许写
guest ok = no # 不允许匿名
create mask = 0777 # 新文件权限
directory mask = 0777 # 新文件夹权限
[public] # 公共目录访问
comment = Public Stuff # 注释
path = /home/samba
public = yes
writable = yes
write list =+staff # 该目录除了 staff 的组员拥有读写权限外,其他用户仅可读
Samba 安全等级可选值有 4 种
用户名密码存放方式设置可选值有 3,默认为 tdbsam,位置 /var/lib/samba/private/passwd.tdb
其中如果选择使用 tdbsam 那么用户管理可以使用如下方法
pdbedit -a username 新建 samba 账户
pdbedit -x username 删除 samba 账户
pdbedit -L 列出 samba 用户列表,读取 passdb.tdb
pdbedit -Lv 列出 samba 用户列表详细信息
pdbedit -c “[D]” -u username 暂停该 samba 用户账号
pdbedit -c “[]” -u username 恢复该 samba 用户账号
正如上面提到的,创建一个新的名为 Openwrt 的共享,需要有些配置,有些配置看名字就能够看出,但是有一些有些复杂。
如果想要创建一个只读的,任何人都可以访问的分享:
[Share]
path = /media/movie
comment = this is folder sync from bt
read only = yes
guest ok = yes
create mask = 0777 # 新文件权限
directory mask = 0777 # 新文件夹权限
参数:
公共的共享可能会有安全问题,所以可以通过用户名密码来管理权限。如果要创建一个用户名密码访问的共享,配置
[PasswordShare]
path = /home/samba
writable = yes # 是否可写
public = yes # 是否公开
browseable = yes # 是否允许在工作组
create mode = 0655
directory mode = 0755 # 设置不同的用户登陆后创建的文件和文件夹权限
valid users = user,user1,@share # 允许访问该共享的用户名(多个用户或者组中间用逗号隔开,组用“@组名”表示)
若希望每个人创建的内容都可以被其他人修改,则设置为 0770, 若希望每个人创建的内容只能被自己修改,分别设置 create 为 0655 和 directory 为 0755
useradd user
useradd user1
groupadd share
usermod -aG share user
usermod -aG share user1
mkdir /home/samba
chmod 777 /home/samba
chgrp share /home/samba
echo "example" > /home/samba/file1.txt
smbpasswd -a user
smbpasswd -a user1
客户端验证 Linux 访问 samba:
smbclient -L 192.168.2.200/publicshare -u user # 密码是自己设置的密码,查看共享内容
smbclient //192.168.2.200/publicshare -U user # 密码是自己设置的密码,ls 可看到共享的详细内容
客户端挂载命令为(客户端需安装 cifs-utils)
mount -t cifs -o username=einverne,password=xxxxx //192.168.2.200/publicshare /home/samba
又到了一年的年末,翻开去年的记录,吃惊的发现去年竟然只看过 16 本。今年年初的时候,计划阅读 100 本书,也的的确确一直坚持了一年,中途可能因为工作耽误了一些进度,但也一直坚持到现在。然而遗憾的是到目前为止,距离 2016 年结束还有短短一个礼拜的时候,又发生了和去年一样的问题,欠下了 10 本左右的债。
耳边总有人说,“为什么总要在意那几个数字?”,而对我而言,那不仅仅是那几个数字,他是年初的一句承诺,对整个年度的一句承诺,如果不能达到这个承诺,那过去说过的话还有什么意义。
今年的书单印证了一句话“因为一本书,爱上一个人,迷上一个类型”,我也曾经在 G+ 上说过,多少年了,还是在三年级到初中的那段时间疯狂的迷过 Verne,多少年的时间里因为学业,因为各种,再难爱上一位作家,再难爱上一段文字。而今年因为一本《解忧杂货铺》让我知道了东野圭吾,也打开了我认知的另一扇窗户。今年的近 90 本中有很大一部分都是东野的作品。而有趣的事,和东野的经历一样,让我们结识悬疑推理的经历竟然如此的相似,这一段经历可以参考 《我的晃荡的青春》,东野的青春竟然也如此的淘气和真实。
而我从年初,从东野最著名的小说开始读《嫌疑人 X 的献身》、《白夜行》在到加贺恭一郎系列,再甚至到不怎么出名,甚至默默无闻的早期作品《以眨眼干杯》《沉睡森林》,再到毒舌三部曲《毒笑小说》《黑笑小说》《怪笑小说》,东野圭吾的书读不到尽头也几乎没有重复,这让我佩服的五体投地。
按时间排序读过
今年的书摘如果都放到这边可能有些多,甚至没有什么必要,有些内容经过整理和摘录,我都放到了 Evernote 中。有些比较长的内容,也有格式化。
其他小说
但回头看自己今年的书单,深感技术类书籍占比略少,去年至少系统的看过 Bash,和基础 Linux,而今年除了看一些基础的 Java 知识,再没有系统地学习一项内容,除了年末恶补了一些 Spring MVC 和 Redis, HBase 的相关知识。因此在制定明年的计划时要讲技术书籍内容比例提高到 10% 左右,有些书值得反复阅读思考和实践,技术类的书既有消费品也有值得反复品味的内容。
今年读过的技术类书:
而其他摄影的类:
还有一些就不列 了。
今天突然收到 Google Play Store 发来的邮件通知,说违反社区准则,原因是没有隐私政策说明。全文如下:
Our records show that your app, {Application Name}, with package name {package name}, currently violates our User Data policy regarding Personal and Sensitive Information.
Policy issue: Google Play requires developers to provide a valid privacy policy when the app requests or handles sensitive user or device information. Your app requests sensitive permissions (e.g. camera, microphone, accounts, contacts, or phone) or user data, but does not include a valid privacy policy.
Action required: Include a link to a valid privacy policy on your app’s Store Listing page and within your app. You can find more information in our help center.
Alternatively, you may opt-out of this requirement by removing any requests for sensitive permissions or user data.
仔细研读几遍之后发现其实只要增加一条链接,说明一下隐私政策。其实主要的原因就是应用中使用到了 android.permission.GET_ACCOUNTS,android.permission.READ_CONTACTS
这俩权限,都是 Firebase SDK 里卖弄登陆要用到的。
仔细研究了一番 Google 的隐私政策, Instagram 的隐私政策 。
然后随着大概意思拷贝了一份。
Pdnsd 是用来缓存本地DNS信息的 DNS 服务器。和 BIND 和 dnsmasq 相比,Pdnsd 在重启之后依然可以保存 DNS 缓存,名字中的 p 表示 persistent。
Ubuntu/Debian 系下使用如下命名安装:
sudo apt install pdnsd
Ubuntu 18.04 中 pdnsd 似乎并没有在仓库中。
默认配置地址 /etc/pdnsd.conf
。
下面配置示例,后面的分号不可缺少。
配置示例:
global {
perm_cache=1024; # 要缓存多少DNS信息
cache_dir="/var/pdnsd";
# pid_file = /var/run/pdnsd.pid;
run_as="nobody";
server_port = 1053;
server_ip = 127.0.0.1; # Use eth0 here if you want to allow other
# machines on your network to query pdnsd.
status_ctl = on;
# paranoid=on; # This option reduces the chance of cache poisoning
# but may make pdnsd less efficient, unfortunately.
# query_method=udp_tcp;
query_method=tcp_only; # 使用 TCP 方式去查询 DNS 服务器
min_ttl=15m; # Retain cached entries at least 15 minutes. 缓存 DNS 最短有效期
max_ttl=1w; # One week. 缓存 DNS 信息最长有效期
timeout=10; # Global timeout option (10 seconds).
neg_domain_pol=on;
udpbufsize=1024; # Upper limit on the size of UDP messages.
}
server {
label= "googledns";
ip = 8.8.8.8, 8.8.4.4;
timeout=30;
interval=30;
root_server = on;
uptest = ping;
ping_timeout=50;
purge_cache=off;
exclude=.cn, .douban.com, .taobao.com
}
Pdnsd 读取配置时,优先级从上到下,上面的 DNS 服务器配置优先于下一层。
pdnsd 需要至少知道一个上游 DNS 服务器用来收集信息
/etc/resolve.conf
中指定了一些DNS服务器地址,在配置 pdnsd 的时候,修改为
nameserver 127.0.0.1
启动 pdnsd 服务
/etc/init.d/pdnsd start
nslookup www.douban.com 127.0.0.1
或者
dig @localhost -p port www.douban.com
如果返回正常,和 webdnstools 比照,则说明配置成功
清空本地缓存
sudo pdnsd-ctl dump # Print information stored in the cache about name.
sudo pdnsd-ctl empty-cache
查看端口占用
sudo netstat -anp | more
pdnsd 只能优化 DNS 解析,并不能避免 DNS 污染。
最近 Evernote, WizNote 纷纷宣布收费,一时间让我手足无措,原本按部就班的一些流程纷纷被打破。但是笔记和摘录总是那样的顺其自然,在翻看自己曾经摘录过得一些整理法则的时候,发现其中有些问题确实自己也已经犯下,在电脑玩物的《Evernote 超效率数位笔记术》书中,作者总结了“Evernote 用户最容易犯的 10 个错误”:1
对于这些错误,最严重的就是第一条,因为 Evernote 和 WizNote 的网摘插件实在太好用,在摘录了大片的内容之后,就忘记整理总结,躺在笔记本中就“死亡”了。幸而这些天这么折腾让我想起了那些笔记墓地,也正好抽出时间来整理一下。正像最后写的那样,”笔记是为了在以后用到,如果用不到,那便是在做无用功”。
早之前就总结过分类和标签,这两者在使用上还是有些区别的,最直观的区别就是一篇笔记只能属于一个分类,而可以归属于多个标签。分类是方便我们整理,而标签是便于我们检索和记忆,同样分类是给我们自己看的,而标签是给机器看的。因而建立一个合理的分类是非常必要的。之前看电脑玩物使用标签整理法,在我个人使用一段时间之后便放弃了,转而使用分类管理,而在过程中打上标签。
根据自己的使用,可以将笔记划分为不同的分类:
等等分类,每篇文章,在未处理之前都在未分类中,在处理完之后都有自己的归属。
这里使用购物清单来作比喻,对于使用记事本来做类似 TODO list 这样的事情来说,没有比使用标签来得更加方便的事情。大部分人可能已经习惯了 List 这样的 Todo 清单,但是对于一件需要长期进行的计划来说,单一的清单可能已经完全不能满足需求。因此才出现了 Trello 这样的多 Board 的清单列表。而对于记事软件比如 Evernote 或者 Wiznote 来说,没有了 Trello 这样的多列待办清单,使用 Tag 来模拟也是可以轻易的实现的。
我的标签命名方式从电脑玩物学来,使用如下:
对于这样的分类能够一目了然并且能轻松快速的找到想要的内容。而使用“!”这样的方式不仅增加了趣味,也让标签更加形象,”$” 就表示和购物相关。
而对于购物清单的子标签中分成想要,调查,不需要,满足四个标签,对于我自己,当在平时浏览网页,阅读 RSS,或者好友推荐,甚至广告中获取某一个产品时,优先添加到想要的标签中。而第二个调查标签为自己在调查想要的产品时可能主动浏览或者搜索的重要内容。而调查的内容可能有两种归宿,一种是在调查过程中发现确实不需要,最后将内容添加到不需要中,另外一种就是为最后列出了需要购买的几点理由,而不得不买时,将内容拖到满足中,并完成购物。当且仅当物品出现在调查中,并且有几点强烈需求时才能将其拖入到满足中。
对于文档标题,使用物品内容 + 型号 + 价格来标识。对于同一件物品使用尽量同一个文档来保存。比如文档” Dji Marvic Pro 6999“ 在想要中记录。然后可能会调查他的摄像分辨率,飞行高度等等参数然后记录。当然最重要的是列出需要购买的理由,不单纯仅限于玩一玩啊。
前段时间处理和广告相关的业务,接触到一些名词,网上也有一些解释,归纳下也好。
Mille is Latin for “thousand” ,千人浏览计费(impressions), 1000人观看价值。 1元/CPM 表示,每千人次观看 banner 广告,则收费1元。每CPM 收费标准不一,国际每 CPM 收费 5美元到200美元不等。一般网络中热门位置广告横幅,视频插播广告,移动端 banner 广告等等通常使用 CPM 收费模式。
对于广告载体,如果有大流量并且广告投放商更加关注品牌曝光率而不是直接进行交易,CPM比较合适。
点击一次计费,对于大品牌广告投放商来说,这明显是不划算的方式,不可预估广告花费。CPC 是购买广告低风险的一种方式,只需要为有效点击付费。 Google 的 AdSense 就是最大的 CPC 市场。
按广告投放实际效果,按有效订单或者有效回访问卷或者有效注册会员等等而定,不限制广告投放的数量。CPA 方式下会计算 effective CPA,简称 eCPA,用来计算投资回报。也就是说,如果通过广告卖出了 5 份产品,那么 eCPA 是 $50 / 5 sales = $10 per sales. 如果能够从每笔交易中获取超过 $10 的利润那将是一份成功的广告投放,而如果没有,那么则需要重新思考市场策略。
每次安装成本计费,常见于手机App 安装。
秒针,admaster, Double Click 等。