这是 Feeder
的更新日志留档.
应用下载请前往 Play Store 或 GitHub 下载.
1 | 完善内置浏览器的界面样式 |
1 | 增加启动时同步(在设置中调整选项) |
1 | 完善详情样式 |
1 | 搜索订阅增加预览内容功能. |
1 | 现在能在订阅管理中搜索并添加订阅了. |
1 | 增加 OAuth 登录 |
1 | Rewritten with kotlin. |
有关 Kafka
日志的设置主要就是下面几个设置,做个记录.
关于时长的设置都是优先使用小单位的设置,即:
ms
>>minutes
>>hours
当最小单位无设置时应用下一级的设置.
log.cleanup.policy
日志处理动作,默认为删除
可选择 delete
或 compact
进行删除和压缩操作
1 | log.cleanup.policy=delete |
log.dirs
日志存放位置,存储到目录
1 | log.dirs=/PATH/TO/KAFKA/LOG/ |
log.retention.hours
日志存放时长 (小时),超过值的日志将会被处理
1 | log.retention.hours=24 |
log.retention.minutes
日志存放时长 (分钟),超过值的日志将会被处理
1 | log.retention.minutes=1440 |
log.retention.ms
日志存放时长 (毫秒),超过值的日志将会被处理
1 | log.retention.ms=86400000 |
log.roll.hours
轮转日志时长 (小时),超过值将会切分日志
1 | log.roll.hours=24 |
log.roll.ms
轮转日志时长 (毫秒),超过值将会切分日志
1 | log.roll.ms=86400000 |
log.retention.bytes
日志最大大小 (partition
),超过值的日志将会被处理
1 | log.retention.bytes=1073741824 |
log.segment.bytes
单个日志文件的最大大小,超过值的日志将会被处理
1 | log.segment.bytes=1073741824 |
参考文档:
]]>今天收到监控警告,说服务器磁盘快满了.
登上去看了一下,发现 MongoDB
的日志没做切分,大小也达到了13G,那就给他做个切分吧.
MongoDB
配置登录服务器,查看 MongoDB
的配置文件,看下有没有配置日志切分的参数.
cat /PATH/TO/MONGODB/CONFIG
1 | processManagement: |
查看 systemLog
段有没有加 logAppend
和 logRotate
,没有就加上:
1 | processManagement: |
MongoDb
配置到这里就完成了,接下来搞切割配置.
logrotate
配置新建个文件,这里就叫 mongod
了
touch mongod
把配置写进去:
1 | /PATH/TO/LOG/*log { |
这里要把 postrotate
路径换成你 pid
文件的路径, 一般会在 /var/run
目录下.
测试一下配置是否正常
logrotate -df ./mongod
测试通过后就把它移动到 logrotate
的配置目录.
MongoDB
, 应用设置这里我用的是 supervisor
,所以直接用 supervisorctl
重启 MongoDB
.
supervisorctl restart mongodb
直接启动的话就在 MongoDB
终端中关闭:
1 | mongod |
关闭后重新启动即可.
]]>最近把 hexo
和 主题 next
都升级到了最新版本,也把大部分 js
/css
转到了 jsDelivr
(国内和网宿合作),整体加载速度有了一定提升.
想着既然都搞升级了,把评论也弄正常点好了.毕竟 Disqus
在国内基本处于没法用的状态.
DisqusJS 是一个在网络状态差或无法访问 Disqus
下的 Disqus
评论展示实现,其原理是在网页加载时访问 https://disqus.com/favicon.ico
来判断客户端对 Disqus
网络连通性,在连通性差的情况下调用 Disqus API
获取数据来提供基本样式的评论展示.
Disqus
切换到 DisqusJS
因为我用的是 next
(7.8.0) 主题,官方支持 DisqusJS
等多种评论系统,所以切换还是挺方便的.
在主题配置文件 _config.yml
中,找到 disqus
段并把 enable
设为 false
.
同主题配置文件,找到 comments
段,将 active
设为 disqusjs
.
在 Disqus 后台 -> Applications -> Settings
中,将你要进行反代的服务器域名填入 Settings -> Domains
中.
同主题配置文件,找到 disqusjs
段,将 enable
设为 true
,并将相应字段填写上从 Disqus
获取的值.
1 | disqusjs: |
nginx
配置,示例如下:1 | server { |
修改完毕后 nginx -t
一下,确保配置正常后 nginx -s reload
就好了.
最近在弄多服务器时间的巡检和校对,选择了 Prometheus
+ Pushgateway
的方式来收集和输出结果,做个备忘.
Prometheus
去 Prometheus 官网 下载好对应系统的版本后,解压到你想放的地方运行即可,这里我使用了 supervisor
进行自启动和运行控制 Prometheus
/ Pushgateway
.
1 | wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz |
这样 Prometheus
就运行在 http://localhost:9090
上了.
如果你不想用默认的端口,可以修改同目录下的 prometheus.yml
中 scrape_configs
区域的选项,将 job_name
为 prometheus
的 static_configs -> targets
中的地址和端口修改成你想要的结果.
Pushgateway
去 Github - Pushgateway 下载对应系统的版本后,解压到想放的地方.
然后运行即可,默认的地址是 http://localhost:9091
.
1 | wget https://github.com/prometheus/pushgateway/releases/download/v1.2.0/pushgateway-1.2.0.linux-amd64.tar.gz |
如果你想修改端口,在运行时指定参数 --web.listen-address=":port"
即可
Pushgateway
向 Prometheus
推送数据在推送数据前,需要先把 Pushgateway
的配置公告给 Prometheus
.
编辑 prometheus.yml
,在 scrape_configs
处(prometheus
节点下)增加以下文本:
1 | # 节点名称,可自定义 |
修改完成后重启 Prometheus
.
重启完毕后,在 Prometheus
中查询 up
,查看节点是否连接上
如上图所示,就是成功连接了.
Pushgateway
强烈建议查看官方 GitHub 文档来实现数据推送,以下内容可能随版本更新而失效.
Fields | Desc |
---|---|
pushgateway | Pushgateway 地址 |
port | Pushgateway 端口 |
job_name | 作业名称 |
metric | 测量值名称 |
metric_value | 测量值 |
1 | echo "[metric] [metric_value]" | curl --data-binary @- http://[pushgateway]:[port]/metrics/job/[job_name] |
1 | echo 'metric{FIELD="VALUE",FIELD2="VALUE2",FIELD3="VALUE3"}' | curl --data-binary @- http://[pushgateway]:[port]/metrics/job/[job_name] |
1 | # 推送所有输入数据,截止到 EOF |
具体 TYPE
类型请查看官方文档.
Prometheus
中查询数据在搜索框中输入你要查询的metric,并选择适当的时间段
示例数据
1 | ntp_check_result{biz="2", env="test", exported_instance="host-ip", exported_job="ntp_check", instance="localhost:9091", ip="ip", job="prometheus-pushgateway", ntp_server="ip", offset="-0.022", time="2020-05-18"} |
你也可以根据上报的字段值来搜索特定的数据
Prometheus
中查询数据 - API详情请查看 prometheus-doc-api ,以下脚本供参考(python
2.7.5 环境)
1 | # -*- coding:utf-8 -*- |
Prometheus
查询 Pushgateway
的 job
和 instance
名称问题在默认配置中, Pushgateway
会将上报的 job
和 instance
数据带到 exported_job
和 exported_instance
中,如要修改此行为,修改 prometheus.yml
中 Pushgateway
的配置:
1 | - job_name: 'prometheus-pushgateway' |
修改完毕后重启即可生效.
]]>接上一篇 斐讯 N1 -> Armbian 后, 我往上面丢了一些服务(Gitea
, , vlmcsd
喂Transmission
等). 玩了一阵后我就因为别的事情搁置了最开始的目的 - 跳板, 直到四月份回坑 Apex Legends 后才因为联通的外网想起这台小机器.
接下来就开始填坑吧
这些就很烦,不怎么想搞
其实我是想直接用 Softether
的, 毕竟服务端启动后就能用有 UI 的管理工具, 点点点就搞好了.
问题是我到现在都没找到 ARM64
的预编译文件(官方不支持此架构)…
新玩具 - 轻量/性能不差/IP 漫游/配置相对简单/未来会支持混淆
好了就你了, 开搞开搞
下文中部分参数意义请查看下表
参数 | 意义 |
---|---|
server_private_key_value | 服务器私钥 |
server_public_key_value | 服务器公钥 |
client_private_key_value | 客户端私钥 |
client_public_key_value | 客户端公钥 |
去 WireGuard 官网 安装对应系统的版本, 你也可以下源码自己编译, 有现成的我一般都不会自己编译(哈哈).
以 Armbian
(Debian
or Ubuntu
) 为例:
1 | echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list |
看看装好了没有
1 |
|
这就装完了, 就下来就是配置了.
1 | wg genkey | tee privatekey | wg pubkey > publickey |
服务器私钥存好, 丢了就要把所有客户端的配置收回来了.
1 | # 打开转发 |
1 | # ip addr |
这里可以看见我的外网网卡名称是 eth0
, 这个记下来.
1 | # 目录不存在时就给它建个 |
1 | [Interface] |
1 | chmod 777 -R /etc/wireguard |
1 | # wg-quick up wg0 |
接下来就是配置客户端了
这里以 Windows
平台, 客户端 TunSafe
为例, 其他平台就不多讲了, 区别不大
去 TunSafe 下载客户端和虚拟网卡驱动(TunSafe-TAP), 安装完成即可.
点击 File - Generate Key Pair 来生成公私钥
记下生成的公私钥, 点击 Edit Config ,开始配置.
1 | [Interface] |
完事, 开始测试
点击 Connect 测试
1 | [user.DESKTOP-DEV] ➤ ping 10.0.0.1 |
到这里就部署完毕了.
你以为到这就结束了? 接下来才是重点, 耗时一个月才解决的血泪史坑
连接成功后,我 ping
了服务器和外网, 都能正常连接, 我兴冲冲跑去 Speedtest 测试速度, 却发现所有网站都连接超时, 连路由的管理页面都上不去
于是开始检查, 防火墙和转发都配置了, ssh
没问题, traceroute
没问题, 还是不能上
这什么情况
妈耶, 搞不定啊, 放狗!
于是就断断续续搜索了一个月(你没看错, 是一个月, 这篇文章本来是要在四月发的), 还是没找到头绪.
反反复复配置, 问题依然存在
我差点都认命去装 OpenVPN
了, 这时脑子一抽, 想起以前瞎折腾给网卡开了巨型帧, 导致无法连接网络的情况, 会不会是 MTU 设置不正确导致出现碎片?
赶紧连到小机器, 查看网卡情况
1 | # ip link |
这里可看到 wg0
的 mtu
是 1420, 编辑客户端配置
1 | [Interface] |
保存后重新连接, 问题依旧, 这到底是怎么肥事啊
不死心, 放狗搜索后找到了这个邮件列表: [WireGuard] Header / MTU sizes for Wireguard , 里面提到了 WireGuard
协议的开销:
The overhead of WireGuard breaks down as follows:
- 20-byte IPv4 header or 40 byte IPv6 header
- 8-byte UDP header
- 4-byte type
- 4-byte key index
- 8-byte nonce
- N-byte encrypted data
- 16-byte authentication tag
妈耶, 我看见曙光了!
赶紧去改配置:
1 | [Interface] |
保存 -> 重新连接 -> Speedtest
好了, 坑填上了, Apex Legneds 启动!
以下是一些参考链接, 供有意者研究(多看文档少踩坑):
]]>现在在宿舍用的是联通的网络(广州联通,50Mbps). 之所以在南方还选择联通的原因是想着在直连的情况下去日本等亚洲国家的速度会比电信好, 事实也的确是这样(非高峰时段 100ms 以内).
但是吧,不知道是联通特别关照我还是出国路由抽风, 针对国外 IP 的连接不定时会全部被阻断 (港澳台都断,妈个鸡), 几分钟后恢复正常. 我 IW4x(ID: YooooEX,来玩耍呀) 一个服务器都找不到, 这还能玩耍?
需求有了, 接下来就是要怎么解决的问题了.
既然国外连接都会被阻断, 那就只能在国内弄个中转跳板了.
pass
现在深港/沪日的 IPLC 价格其实还好, NAT VPS 一个月能控制在 100 以内, 就是流量和带宽余量都很捉急, 而且就为了这个似乎有点浪费啊
家里的电信宽带办的时间也是挺久的, 所以拨号有外网 IP, 即使在升级过多次套餐后也依然如此(现为 200Mbps / 30Mbps uplink). 那不就可以玩耍了? 又不是没当过高 Ping 战士…
对于 NAT 网络, 2018年底三大运营商已经在很多地方配置和开放了 IPv6 路由, 这使得以往部署个人服务最大的门槛 - 公网IP 被消除了. 只要你的路由支持 IPv6 并且正确下发配置(我这边是无状态,使用DHCPv6-PD分配地址), 在路由后的设备都是可以获取到公网 IP 的.
不过随着 Ipv6 的普及, 越来越多未被正确配置隔离的设备会被直接暴露在公网上, 到时又是黑产丰收的季节了.
本来想的是用 Raspberry Pi 3b+
来做服务器的, 后来算了一下成本:
emmmm,这价格再加点都能捡套 3317u 的平台了,而且 3b+ 的有线走的USB通道, 感觉 300Mbps 的吞吐量在未来一两年内就不太够用了.
在纠结是选择 x86 还是 3b+ 的过程中, 我在网上和各个论坛中游荡, 当逛到恩山时,想着更新下路由固件的我看到了跑路讯的两个设备: 斐讯N1
和 斐讯T1
, 被其性价比折服.
具体硬件配置:
T1 | N1 | |
---|---|---|
CPU | Amlogic S912(b?), 8-Core Cortex-A53, 1.5Ghz | Amlogic S905D, 4-Core Cortex-A53, 1.8Ghz |
GPU | Mali-T820 MP3 | Mail-450 |
RAM | 2G | 2G |
Storage | 16G EMMC | 8G EMMC |
Network | BT4, 802.11 n/ac | BT4, 802.11 n/ac |
Interface | HDMI * 1, USB * 1, 100M Ethernet * 1, AV * 1 | HDMI * 1, USB * 2, 1000M Ethernet * 1 |
配置上来说是 T1 比较高, 但是 T1 的有线是 100M 的, 而且 USB 接口也比 N1 少一个, 最后还是选了 N1.
目前 N1 在咸鱼上 80 左右就能收到,而 T1 还是要小一百的,怎么选择就看你自己的需求了.
Armbian
镜像: 下载地址 (N1 选择 S905,T1 选择 S912)n21w
)将东西都准备好之后就可以开始弄了.
由于我的 N1 到手就是官改的版本, 自带 root, 所以我是直接在终端里面开启网络ADB的
1 | su |
原版系统请参考下文
在N1的主界面的 固件版本 点击4次,会看到adb打开的提示
开启后连接即可
1 | adb connect ip-address |
等设备进入 Fastboot
模式后, 用双公头连接 N1 靠近 HDMI 的 USB 口和电脑
1 | fastboot flash boot boot.img |
刷入分区后重启
1 | fastboot reboot |
解压镜像, 打开 Win32 Disk Imager
, 选镜像和U盘, 搞定
烧录完成后,进入新显示的磁盘(Boot),修改 uEnv.ini
1 | ; meson-gxl-s905d-p230.dtb ---> N1 |
修改完毕后弹出U盘.
将显示器和键盘连接到 N1, 将U盘插入到 N1 靠近 HDMI 的 USB 口, 然后进入更新模式
1 | adb reboot update |
设备重启完毕后,你应该进入 Live CD
了, 默认账号密码是 root
和 1234
进入系统后, 在 /root/
目录下有一个名字叫 install-22018.sh
的文件, 运行并根据提示配置 Armbian
, 等待安装完毕
1 | ./install.sh |
关闭或重启设备时将U盘拔出,就可以进入安装到 EMMC 的系统了.
如果要配置和使用无线可以用 nmtui
, 至少还有个界面看
如果没有公网 IP 可以使用 Frp
等工具来打洞: Frp
有公网就直接上 DDNS 吧,我使用的是 CloudFlare
, 一个脚本加定时任务就能搞定:
1 |
|
crontab
加个任务
1 | # */5 * * * * sh /root/ddns.sh > /dev/null |
其他玩法就慢慢发掘吧, 这和正常的 Linux
并没有多大的区别. 说起来这是目前我玩过最大内存的 Linux 设备了…
如果你对 Armbian
不感冒的话, 这里也有其他系统可以玩: phicomm-n1
先给WebView
一个固定高度,在页面加载时重新设置高度
1 | <com.yooooex.widget.CustomWebView |
1 | mWebView.setWebViewClient(new WebViewClient() { |
你也可以先把 WebView
GONE 掉,在页面加载完毕时显示
1 | <com.yooooex.widget.CustomWebView |
1 | mWebView.setWebViewClient(new WebViewClient() { |
今天中午朋友找到我,说想要给自己的游戏针对国外做反向代理 (被老外喷卡,哈哈),那就做一个咯
因为只需要转发请求,配置需求不高. 所以我就在 DediSERVE 注册了个账号,创了个 5欧 1G 内存,25G 硬盘的实例(AFF警告: 链接在此)
服务器使用 Debian 8
, Server Hostname 填写的是要 代理的域名 (重点,后面就因为这个掉坑里了)
老规矩,自己动手丰衣足食
1 | sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev git |
1 | wget -c https://nginx.org/download/nginx-1.11.13.tar.gz |
1 | wget -O openssl.tar.gz -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2k.tar.gz |
如果没指定安装位置的话,默认会安装到 /usr/local/nginx/
1 | cd nginx-1.13.12/ |
1 | vim /etc/init.d/nginx |
输入以下内容:
1 |
|
授权
1 | sudo chmod a+x /etc/init.d/nginx |
1 | vim /usr/local/nginx/conf/nginx.conf |
修改为以下内容:
1 | #user nobody; |
1 | service nginx start |
万事俱备,是时候看结果了!
这是什么鬼!
检查开启!
检查配置文件 ☑
检查日志 ☑
放狗搜索 ☑
然而并没有什么用
在20多分钟的放狗后,我找到了一篇文章 - nginx配置反向代理或跳转出现400问题处理记录
文章作者也遇到了和我差不多的问题,而他的问题在 proxy_pass
由域名换为IP后解决
然而对我并没有什么作用
从中午找到下午,接近两个小时依然没有解决这个问题
万念俱灰之际,我随手 ping
了一下域名
1 | 64 bytes from example.com (255.255.255.255): icmp_seq=1 ttl=64 time=0.051 ms |
看到这结果,马上跑去看 hosts ,结果让我看到了浪费两个小时的原因:
1 | cat /etc/hosts |
原因是在创建VPS实例时,会将填写的域名记录写到 hosts 里头. 因为当时还没有定好域名,就随手把 要反代的域名 填上去了
唉,今天真高兴啊……
]]>看到好用的就记下来,以后填坑用
一个 RecyclerView.Adapter
框架,写得少干得多
当前页面指示器 Lite
当前页面指示器 Advanced
功能齐全的富文本编辑器
]]>Let's Encrypt
在近两年的发展中十分迅速. 官方在2016年3月8日宣布签发证书达到一百万张后( Our Millionth Certificate ), 在一年半后的2017年6月28号便宣布签发证书达到了一亿张( Milestone: 100 Million Certificates Issued ).
官方也宣布在2018年一月份(鸽了,三月份)开始支持签发泛域名证书( Wildcard Certificates Coming January 2018 ),在使用和部署上会变得更加方便.
官方的签发工具是 certbot
,它可以启动一个 Web 服务器来验证域名所有权,也可以用配置文件指定 Nginx
的 WebRoot
目录来验证( 需要在 Nginx
配置相应路由 .well-known/
).
但是在开始使用 CloudFlare 的服务后,我发现 certbot
使用 DNS-01
验证方式比较麻烦懒的看官方的 Authenticator. 然后我就换成 acme.sh
了.
自动安装 ( 喜欢手动安装看 这里 )
1 | wget -O - https://get.acme.sh | sh |
运行这个脚本会干以下事情:
将 acme.sh
安装到你的用户目录下: ~/.acme.sh/acme.sh
创建 alias : . "/root/.acme.sh/acme.sh.env"
创建定时任务 :
1 | root@yooooex:~# crontab -l |
手动更新
1 | acme.sh --upgrade |
自动更新
1 | acme.sh --upgrade --auto-upgrade |
关闭自动更新
1 | acme.sh --upgrade --auto-upgrade 0 |
WebRoot
和 Standalone
验证WebRoot
和 Standalone
验证方式就不多说了,和 certbot
大同小异,看文档就好( English | 中文 )
DNS-01
验证TXT
记录1 | acme.sh --issue -d example.com --dns |
1 | [Fri Dec 1 15:17:45 +06 2017] Creating domain key |
TXT
记录将 Domain
和 TXT value
记录下来,在域名管理商处添加对应的 TXT
记录,并等待其生效.
查询域名
TXT
记录
1 | nslookup -type=txt _acme-challenge.example.com |
当 TXT
记录生效后,便可生成证书.
1 | acme.sh --renew -d example.com |
因为我用的是 CloudFlare
,以下操作都是在此基础上进行的,不过和其他 API 也只是参数不同而已. 详看 这里
先去 CloudFlare 拿到 API key ( Overview -> Domain Summary -> Global API Key )
1 | export CF_Key="your key" |
设置完毕后便可以生成证书了.
1 | acme.sh --issue --dns dns_cf -d example.com -d www.example.com |
* 输入的参数会保存到
~/.acme.sh/account.conf
中,以后会自动调用.
使用 --installcert
命令来导出证书
1 | acme.sh --installcert -d example.com \ |
Nginx
,具体的命令要看你用什么了2018-3-14 更新:
Let’s Encrypt 已在昨天上线 Wildcard 证书(目前只支持 DNS-01
验证方式),步骤其实和普通的域名差不多,只需增加通配符就可以了.
1 | acme.sh --issue --dns dns_cf -d example.com -d *.example.com |
之前说了 Fabric ,这次就来说说内存使用这个东西吧.
千里之堤,溃于蚁穴 - 韩非《韩非子·喻老》
都能用,就这样吧
因为开源的特性, Android
拥有着各种各样不同尺寸屏幕和硬件配置的设备.
顶级到 5-6 寸 Snapdragon 821/Exynos 8890 + 6GB 的旗舰机型
目测到新机型出来为止还是要靠抢的 4T
在 BOOM7 宣布回收后独立支撑的 S7E
低端到充几百块电话费就能送的联发科/瑞芯微 + 1GB / 512MB 的运营商定制手机
移动定制机,放狗搜了下这货貌似还用的 YunOS
种类繁多的设备决定你在开始开发应用时就要想好要不要考虑使用低端设备的用户,这使得你要在系统版本,动画效果,依赖的使用等方面有所取舍,毕竟在低版本低配置的设备上做兼容会增加一部分代码和工作量.
如果你选择了兼容的道路,那就要在优化上面下点功夫了(当然写任何程序都应当在优化上面下功夫).
在代码方面只能靠深入学习来慢慢优化,但在内存泄漏上, Square 的 LeakCanary
拯救了 Android
开发者于水火之中,只需把它丢进你的依赖列表里面,然后再写上两三行代码, LeakCanary
就能自动检测内存泄漏并在发现泄露时通知开发者.
先在 LeakCanary
的 Github 上查看最新的版本,毕竟在理论上来说新的总比旧的好.
在 Module
级别的 build.gradle
中添加依赖并同步
build.gradle
1 | dependencies { |
在你的 Application
类中初始化 LeakCanary
Application.class
1 |
|
如果你有使用Fragment
,那么要多写几行
Application.class
1 | public class YooooEXApplication extends Application { |
YourFragment.class
1 |
|
到这里 LeakCanary
就已经配置完成了,当你使用的 Build Variant 中 Debuggable 为 true 时, LeakCanary
在发现内存泄漏时会弹出通知提示你它发现你露出了,并会给出泄露源头.
]]>
妈蛋我漏了
在昨天举行的 GDD BeiJIng 2016 上,Google 宣布了中国版 Google Developers 网站的上线. 开发者们能在这上面找到 Google 各种产品的 API 文档,开发案例和讲解视频等资源. 在中国的开发者终于不用扶梯就能查看和学习由官方发布的最新技术和资讯了!
中文诶!
不过网站上面还是有一部分资源是你不扶梯就看不见的,而且数量还不少:
想玩 GCE ?
嗯…
开发者控制台所有链接无法直接访问( GAE 你就更别想了)
嗯嗯…
同上
唔唔唔…
虽然有部分东西不能用,但有 API 文档看就足够了!(部分有中文)
]]>不久前我曾经说过要做个回顾(嗯,这很不久),我就先从应用选用的工具说起吧.
千里之堤,溃于蚁穴 - 韩非《韩非子·喻老》
为了写一个质量较好的应用,一个趁手的数据/崩溃统计 SDK 是必不可少的.
其实国内友盟这些做的还是不错的,只是太臃肿了(大而全的后果),最新的 6.0.4 就达到 1.5MB 了,我的应用才 2M 不到,也不需要那么多的功能.
而且我更希望使用 Gradle
来管理和更新这些东西,这也避免了 SDK 版本需要更新的麻烦(还是懒).
最后我选择了 Twitter 带来的 Fabric.
Free~
Fabric
支持 Android/IOS/Unity (纪念在天国的 Windows Phone),它可以根据你的需求来自定义模块,而且集成也是十分简单的.
Fabric 的模块们
目前我使用的只有两个模块: Crashlytics 和 Answers. 前者用来检测应用崩溃和分发 Beta 应用,后者用来统计数据(用户量/事件等).
因为我写的是 Android 应用,所以就只有 Android 版本的了. 其他平台步骤应该差不了多少.
Android Studio/IntelliJ IDEA
步骤十分简单:
Fabric
并登陆账号
Fabric
的位置,你也可以 Ctrl+Shift+A then type fabric 来开启它.
你可以直接在这里添加你需要的模块
应用异常查看(我都不好意思发这张图了哈哈)
在 IDE 中你可以简略的查看应用的崩溃信息,详细信息还是要去网页和客户端看的.
在网页端你能详细的查看各类信息.
即时的统计信息
各类事件统计
崩溃详细信息
要使用 Fabric
,我们需要:
fabric.properties
中添加你应用的 apiSecret.Module
级别的build.gradle
.Application
类中将其初始化.build.gradle
1 | buildscript { |
Application
类
1 | public class YooooEXApplication extends Application { |
fabric.properties
1 | #Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. |
如果你按照 导入依赖 一路走下去的话,Fabric
就已经自动初始化完毕了. (把这个放在后面是因为我想让你们看看手动配置是很麻烦的一件事情哈哈哈哈哈哈哈)
至此, Fabric
就已经完成初始化并开始收集数据了.
手动提交异常
Fabric
默认的设置已经能满足我的大部分需求,但是不折腾一下还是不行滴(不然写这个东西干嘛呢).
一般来说我们对可遇见的程序异常都会捕捉起来并返回错误信息给用户,但对于不可预料的异常便无能为力了. 下面是我在 Feeder 中对网络请求发生异常的一段处理代码:
1 | /** |
Feeder 的网络请求是通过 Retrofit
+ RxJava
来实现的,当发生异常时,这段代码会判断异常是不是网络请求抛出的. 如果是 HttpException
则展示相对应的错误信息给用户. 当没有相对应的异常时就会返回一个”未知错误”信息给用户.
在这里我已经对可预见的网络异常加入了判断语句当中,但当发生了意料之外的异常时, Fabric
中的 Crashlytics
模块就能起到作用了.
我们看向 31-32 行:Crashlytics.logException(e);
Crashlytics.log("An unexcepted exception occurred. Context: " + context.toString());
在这里我调用了 Crashlytics.logException(Throwable throwable)
和 Crashlytics.log(String msg)
这两个方法.当发生意料之外的网络异常时, Fabric
会向服务器提交这个异常,并附上了相应的 Context
来帮助我更快速的定位到问题所在.
当然, Crashlytics
还能提交变量,帮助你更详细的分析异常原因:
1 | Crashlytics.setString(key, value); |
提交统计信息
和异常一样,要想让 Fabric
收集统计你自定义的数据,你还需要运用好 Answers
模块.
Answers
默认会统计的手机型号和系统版本等信息,如果你想要更详细的事件统计信息(用户登录/注册/分享内容等),你就需要自定义一些东西来满足你的需求了.
还是拿 Feeder 来做例子,来一个登录事件的统计吧.
用户登录
1 |
|
登录事件完成后的回调
1 |
|
可以看见,在用户点击登录后,程序开始向服务器进行验证,当验证完毕后,根据验证结果调用 loginResult(flag)
.
loginResult(flag)
中则根据结果调用了 Answers
1 | Answers.getInstance().logLogin(new LoginEvent() |
当调用此方法后,Answers
模块就会向服务器提交事件信息,你就可以得知用户的登录状况统计了.
想要自定义事件也是比较简单的,如果你只是在一个地方提交这个事件,你可以使用 CustomEvent
:
1 | Answers.getInstance().logCustom(new CustomEvent("EventName") |
如果该事件在多个地方都要提交,你可以把它封装好或照着 Answers
中官方提供的事件写一个.
参考连接:
]]>因为懒癌好久没更新了,今天就来写点东西吧.
这段时间回了家乡,然后写了个 简陋 简洁的第三方 Inoreader Rss阅读器客户端(能做出个给大伙玩的东西,我很欣慰),现在已经上架了.
在写这个应用的过程中重温和学习了很多东西,在近期会做个回顾,防止以后再踩到这些坑,也希望能给看到的人学习到什么吧.
没错这就是个广告-快来下快来下快来下给我意见啊啊啊啊啊
另外求求 dalao 们赏个脸给小的做个图标吧,做设计实在是太痛苦了…
]]>Let’s Monitor 是一个由 Let’s Encrypt 所提供的免费监控服务,通过它你可以方便的查看你的证书剩余有效期,而且在证书接近过期时得到提醒.
网站地址: Let’s Monitor
免费证书申请:
]]>本来以为这工具已经停止开发了,今天整理书签时去看了看,没想到它前几天竟然又开始更新了.看来定时整理书签还是有好处的哈哈哈既然这样就推荐给大家使用吧.
Clover
是一个 Windows Explorer
插件,它能让你的文件管理器拥有跟浏览器相似的体验.
就像 简介 说的那样, Clover
为 Windows Explorer
提供了跟游览器类似的标签栏和收藏栏,让你能快捷的在文件夹之间转换,提高你的工作效率.
标签栏(多标签页)
收藏夹(快速跳转)
主题支持( Chrome 主题)
返回上一级(双击空白位置)
Clover
的快捷键与 Chrome
十分相似,可以说到手即用,学习成本十分小.
快捷键 | 效果 |
---|---|
Ctrl + 数字 | 切换到指定的标签页 |
Ctrl + N | 打开一个新的 Clover 窗口 |
Ctrl + T | 新建标签页 |
Ctrl + W | 关闭当前标签页 |
Ctrl + Shift + T | 重新打开关闭的标签页 |
Ctrl + D | 添加书签(有选择文件、文件夹的情况下,是删除文件) |
Ctrl + Shift + D | 为所有打开的标签页添加书签 |
Ctrl + Tab | 切换到下一个标签页 |
Ctrl + Shift + Tab | 切换到上一个标签页 |
Ctrl + Shift + B | 显示或隐藏书签栏 |
优点:
轻量
与 QTTabBar
等工具相比, Clover
功能相对简单.但对于不折腾的日常用户来说, Clover
对他们来说应该是更好上手使用的.
对于折腾帝和效率狂人,他们眼中应该只有 Total Commander
才对吧哈哈哈哈哈
集成在 Windows Explorer
中
无需专门打开软件,使用体验较好.
缺点:
Windows
7 / 8.1 相比慢了许多,不过这是支持新系统的第一个 Beta
版本,后续应该会修正这个问题.Clover
后, Windows Explorer
的边框会变得有点奇怪(注意在 功能 的配图, Windows Explorer
的边框会有蓝色的边框),之前版本的 Windows
中是不会出现这个情况的.Clover
,我使用的一些软件也出现了这样的现象,例如下图的 Internet Download Manager
:目前软件处于 Beta
状态(版本号:3.1.1.07271 ,2016-08-01),而且这是适配 Windows 10
的第一个版本,后续更新应该会完善这些问题.
自用的 Android 开发工具,在此分享给大家.
如图所示,它的确很快
虽说 Google 虐我千百遍, 我待 Google 如初恋 ,但是 Android
官方的模拟器性能真的是不忍直视,即使是 Android Studio 2.1 + Intel HAXM 还是能感觉到明显的卡顿,直到我发现了它:
好了,以后再也不用点完手机再看屏幕了,YEEEEEEEEEEEEEEEEE!
Genymotion 提供了各种尺寸的模拟器,速度快的飞起,还提供了电池状态/摄像头/GPS/网络状态/电话等硬件状态模拟,让你在电脑方便的调试.
我要找点什么玩呢
虽然虚拟机调试是很方便,但真机调试是开发应用中不可缺少的一环,要一台台接线调试又很麻烦,用无线调试也只是减少了接线的步骤,你还是要拿起一台台设备慢慢测试.
Perl 之父 Larry Wall 曾说过,程序员的三大美德是 “懒惰” “不耐烦” 以及 “傲慢”.
作为一个想成为合格程序员的人来说,我认为我还是挺符合第一点的.
然后我就到处乱逛找到了这个:
Vysor - A window to your Android
Vysor 是一个让你在电脑上控制手机的 Chrome 应用(不需要 Root ),你可以使用有线/无线来连接并控制多个设备.
真机测试开发不用再看来看去了,在电脑上就能完成一切工作.
拿来给客户演示效果也是很不错的.
* 注意,要正常使用软件, Chrome 需要先安装 PNaCl 组件.
查看安装状态: chrome://nacl
安装 Pnacl 组件(点击 “检查是否有更新” ): chrome://components/
你是 Terminal 党还是 GUI 党?
就像名字一样, Chrome ADB 是一个使用 ADB 调试设备的 Chrome 应用,它能进行安装/卸载/清除应用数据等操作,也能查看各个应用占用的内存,而且还提供了基本的设备控制功能.
我感觉我还能再懒一点
Postman (Chrome, Mac) 是一个功能强大的 API 调试工具,使用它能快速的构建 API 请求(POST, GET, HEAD, PATCH 等),还可以添加 OAUTH 等认证,并测试返回结果是否符合需要求.
它还可以将你写的测试添加成一个集合,并同步到服务器,你还能把它分享给他人或在团队中共享,想想就觉得生活原来可以这么美好~
从此不求设计师,翻身做主人
TinyPng 是一个图片压缩(有损)工具,支持 .jpg
.png
格式,压缩效率还是挺不错的.
如果你需要无损压缩或离线处理的话,我建议使用 limitPNG 来处理,目前本站所有的图片都是由它来完成压缩工作的.
你想要最新最流行的轮子吗?这里就是你的天堂!
Android Arsenal 是一个聚合类的网站,展示了流行的 Android
开发库和各种各样的 Demo , 你可以在这里快速找到大部分开发者对 UI/网络/数据处理所选择的类库,众人拾柴火焰高,能让你少走点不必要的坑.
面向 Google 编程 2nd gen
Codota (Chrome, Android Studio) 是一个代码实例仓库,目前已经收集超过700万来自 GitHub/StackOverFlow/知名博客/开发者网站的代码示例.
除了网页版, Codota 还提供了 Chrome 和 Android Studio (需要 Token ,插件会提示) 插件,让你可以在这两个应用中直接查看和收藏代码,妈妈再也不担心我会加班了也能参考下其他人的思路,好评!
暂时写到这里,等我想到新的再补充吧.
]]>limitPNG
是一个使用 Electron
构建的 Png
有损/无损压缩软件.
对于不熟悉终端命令和配置 pngout
pngwolf
, pngquant
等 Png
压缩工具的苦手(我,测试配置真痛苦)来说,这是一个很不错的工具.
针对有损和无损压缩,
limitPNG
提供了丰富的压缩选项让我们选择.
无损:
有损:
输出选项有覆盖/添加后缀,输出到指定文件夹,足够日常使用了.
处理方式 | 文档大小 | 压缩百分比 | 效果 |
---|---|---|---|
原图 | 241 KB | 100% | 图片 |
无损(强力) | 217 KB | 90.04% | 图片 |
无损(快速) | 215 KB | 89.21% | 图片 |
有损(高质量) | 132 KB | 54.77% | 图片 |
优点:
缺点:
Electron
构建的软件和同类软件比较体积都是巨无霸级别的了.目前软件还处于 Beta
状态(2016-6-23),期待正式版出来会带来各方面的改善和加强.
为了能同时支持 HTTP/2
和 Spdy
,所以我使用了 Nginx
1.9.7 + Cloudflare 的补丁.
我使用的系统是 Debian
8.0,请根据自己的系统调整相应的包管理器命令.
首先安装编译要用到的依赖库和工具.
1 | sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev unzip git |
然后获取 OpenSSL
, Cloudflare 的补丁和 Certificate Transparency 补丁.
1 | wget -O openssl.zip -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2h.zip |
默认安装到 /usr/local/nginx ,如果想更改路径可以在编译时指定 --prefix
参数.
1 | wget -c http://nginx.org/download/nginx-1.9.7.tar.gz |
为了方便管理 Nginx
,我使用脚本来对 Nginx
进行操作.
sudo vim /etc/init.d/nginx
1 | #! /bin/sh |
为脚本增加执行权限
sudo chmod a+x /etc/init.d/nginx
打开 Nginx
安装目录下的 conf/nginx.conf 配置.
1 | #user nobody; |
1 | # Port 80 |
当配置完成后,可以到 Qualy’s SSL LABS 来测试配置.
如果配置没出现什么问题的话,你的网站测试应该是像我这样的:
OCSP Stapling
未启用,可能与我使用的证书有关.Public Key Pinning
(HPKP) 未配置,找个时间看看.