Akawa

ETY001的博客

春节假期快结束的时候,终于是找到了些时间来埋一埋去年的坑。经过2.2.0到2.2.6几个版本,终于把新版完成了。

在去年年中的时候,我开发了一款chrome应用,目的是为了方便自己整理自己的书签栏。想法很简单,就是利用零碎的时间去review自己的书签栏,没有用的就可以删除掉了。毕竟,单独拿出时间去整理书签栏,是个很累人的活,把这个活分散成零碎的时间去完成,倒也惬意。

这个想法其实是四年前的,只不过一直没去做罢了。每当自己的书签栏迫切需要整理的时候,就会想起来这个想法。终于在去年7月左右开始动工了。

不过开发进展不是很顺利,毕竟自己不是个专业前端,英语水平也一般,看chrome的文档就耗费了很多精力。先是把整个的chrome的文档页面的结构理顺了一下。真的是很想吐槽下chrome开发的文档组织的很糟糕,Api接口的列表的进入放在了一个三级的目录中,几乎每次要找一个Api接口的时候,都要翻好久,主要是找一级菜单就要花好久。

后来习惯后,也就习惯了。。。

最初的计划是能够每次打开新标签页的时候,自动提醒一次,提醒的数据是随机从书签栏里获取,使用 Chrome 的 Notification 接口显示书签名和地址,并提供打开和删除按钮。(原始想法,雏形)

但是在开发的过程中,首先发现的问题是,随机获取一个书签并不是像自己想的那样。
本来计划是扩展安装的时候,自动把书签一次性读入到html5的本地存储中去,然后从本地存储中随机获取。但是这里面涉及到几个点:

1
2
1、使用何种本地存储能方便的检索数据?
2、用户变动书签信息(增加、删除)的时候,还需要同步到本地存储中。

考虑到后期可能会迁移到 Firefox 和 Safari,于是选择本地存储的时候,我除了考虑数据的获取外,还参考过兼容列表。最终觉得还是先不要想那么远了,先把chrome版本的做好再说其他的。于是选择了IndexedDB。

然后的问题就是如何随机。在考虑这个问题的时候,我最先想到的就是获取本地存储中的书签列表的索引范围,然后写个方法来从这个索引范围中随机一个数。但是后来觉得这样不是很妥,如果随机性不是很好的话,那么可能某些书签被随机到的概率很大,那么效果就不理想了,或者是某个书签连续几次都被随机到,那么用户体验也是不好的。

那么能不能加个访问量的字段,然后把这个字段纳入到随机数的计算中呢?倒是可以,不过貌似这样程序就复杂了太多了,我也不知道最后做出来的效果是否满意,所以最后就放弃了随机一条书签的计划,改成顺次提取一条书签了。实验证明,这个方案至少我自己是满意的。

另外的就是找到书签的监听接口,在用户操作书签的时候,能把数据同步到本地存储中。不过这里当时为了赶时间尽快做出来看效果,就省掉了数据同步,而是每次打开新标签页获取一条书签的时候,都会读一遍全部的书签列表,然后把索引记录在本地存储中,以及这次访问的索引值存储在本地存储中。

第一版差不多就这样勉强的上线了。

上线后,发现还是有不少人来安装,真的是很感谢这些初期的用户。但是貌似我没有具体的运营数据。于是又研究了下 Google Analytics,在扩展中加入了一些操作事件的记录,依次来看一下,现在有多少人在用,提醒了多少次书签,删除了多少次书签。依次来判断我的扩展的价值。

之后,有用户开始反馈。反馈的主要问题就是弹出框和不再提醒机制。

弹出框的第一个问题,主要就是各个操作系统的 notification 差异性导致的。在 Win 下,notification 是在右下角弹出,而 Mac 和 Linux 下是在右上角。我的开发环境是 Mac,所以最初在右上角弹出,我觉得可以,就没有多留意。后来 Win 用户提出来能不能把提醒从右下角放到右上角,我才发现了这个问题。

弹出框第二个问题,右上角弹出的时候,有时候可能正好挡住了标签页的关闭按钮(在标签页打开了很多的时候),这样进行关闭标签页的操作时,要先关闭 notification ,才能点击标签页的关闭,显得很不方便。

弹出框的第三个问题,chrome升级某个版本后,notification 不再自动关闭了,只能手动关闭了。

弹出框的第四个问题,chrome 的 notification 只支持添加最多两个按钮,而当前已经有『打开标签页』和『删除』两个了,想再增加『不再提醒』按钮是不可能了。

关于『不再提醒』功能,是用户提出来的,希望能够把一些书签设置为『不再提醒』。

针对用户提出来的这些问题,我一直都很想处理,最后还是拖到了年后。

年后第一版v2.2.0,重构了本地存储部分,把书签存储在了 localStorage 中,并且完成了用户变动书签后,自动同步到 localStorage 中,这样每次取数据的时候,只需要从 localStorage 中获取 bookmark_id ,然后再调用 Api 取详细信息即可。这样也便于以后向 Firefox 和 Safari 迁移。

v2.2.0 – v2.2.2 还弃用了 notification 接口,使用替换『新标签页』的方式,我自己写了一个 html 页面,可以显示书签标题和网址,带 iframe 预览功能,带『新标签页打开』,『删除』,『不再提醒』等按钮。

上线后,好几个用户反馈能不能不替换新标签页。其实我最初也是不想替换的,但是无奈 chrome 应该处于安全考虑,不允许向 chrome://newtab/ 插入js代码,所以我也是不得已为之啊。

不过经过思考,觉得没必要非要在『新标签页』中进行提醒呀。于是开始开发迷你模式,即把弹层放到了正常的网页中去,也就是现在 v2.2.6 版本大家所看到的。

到此,这个扩展应该基本上就完成了。估计短时间内是不需要增加或者修改什么功能了。

总结一下,开发扩展基本上就跟开发传统软件是一样的了,应该要遵循传统的流程。平时自己写 PHP 网站写习惯了,遇到问题随时修改随时上线。现在扩展出个bug,至少要60分钟才能发布完毕,等用户升级到新版本还不知道什么时间。我在开发的时候,经常遇到的就是这个问题,某个版本发布前已经测试的很不错了,结果在商店点击完发布了,又用了几次就发现新问题了,导致自己不得不增加版本号,重新上传修复bug后的版本进行发布。

另外就是需要加强与用户的沟通和交流,现在感觉做的最不足的就是这一点。其次就是交流后,用户反馈的哪些该采纳,哪些该舍弃,还是个很让我迷惑的问题。这个还需要再思考思考。

最后,附上扩展地址和反馈地址:

http://bm.to0l.cn/

https://gitter.im/ety001/bookmark-extension

今天在CentOS7中安装部署L2TP,但是用systemctl启动的时候,总是报下面的错误:

1
xl2tpd.service start request repeated too quickly refusing to start

直接使用xl2tpd -D就能启动成功,于是把重点检查对象放在了/usr/lib/systemd/system/xl2tpd.service这个文件上。

通过多次试验,发现把下面的这行注释掉后,就能正常使用了

1
#ExecStartPre=/sbin/modprobe -q l2tp_ppp

另外再附带上iptables的配置:

1
iptables --table nat --append POSTROUTING --jump MASQUERADE

** 1、运用编码技术绕过

如URLEncode编码,ASCII编码绕过。例如or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。

** 2、通过空格绕过

如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
or swords =‘swords,由于mssql的松散性,我们可以把or swords 之间的空格去掉,并不影响运行。

** 3、运用字符串判断代替

用经典的or 1=1判断绕过,如or swords =swords,这个方法就是网上在讨论的。

** 4、通过类型转换修饰符N绕过

可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or swords = N swords ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。

** 5、通过+号拆解字符串绕过

效果值得考证,但毕竟是一种方法。如or swords =‘sw + ords ;EXEC(‘IN + SERT INTO + ….. )

** 6、通过LIKE绕过

以前怎么就没想到呢?如orswords LIKE sw!!!显然可以很轻松的绕过“=”“>”的限制……

** 7、通过IN绕过

与上面的LIKE的思路差不多,如or swords IN (swords)

** 8、通过BETWEEN绕过

如or swords BETWEEN rw AND tw

** 9、通过>或者<绕过

or swords > sw
or swords < tw
or 1<3
……

** 10、运用注释语句绕过

用//代替空格,如:UNION // Select /**/user,pwd,from tbluser

用//分割敏感词,如:U// NION // SE// LECT /**/user,pwd from tbluser

** 11、用HEX绕过,一般的IDS都无法检测出来

0x730079007300610064006D0069006E00 =hex(sysadmin)

0x640062005F006F0077006E0065007200 =hex(db_owner)

** 12、大小写互换绕过

select 可以写成 SelEct

union 可以写成 UnIoN

** 13、多种编码组合绕过

常用的有BASE64、ASC、SQL、HEX、URL编码

** 14、利用中转工具绕过

可以利用刺猬的中转工具来绕过

** 15、利用特殊字符填充绕过

这些特殊字符,会被解释成空格,方式和通过空格绕过一样的,一般用来绕过第三方防火墙软件

** 16、改变攻击方式

如果get提交实在无法绕过,可以尝试改变攻击方式。如;post注入、寻找子站、旁站……等,如有疑问可以随时联系我QQ814360954哦,我很乐意和大家交流黑客技术。

今晚风很大,今晚是2015年最后一个夜晚,2016年的第一个夜晚。

过去的2015年,对于我,是回归的一年,也是发生了许多事的一年:

  • 第一次创业结束
  • 离开帝都,返回老家
  • 上半年结束了一段短暂的感情,下半年又开始了一段新的历程
  • 开始了远程工作模式
  • 注册了一个域名,希望可以写点文字性的东西
  • 埋了一个毕业的时候的坑
  • 重新关注起了比特币
  • 第二次创业开始

第一次创业结束

第一次创业,经历了很多的事情,曾经在那段全职创业搞产品的阶段,每天工作到凌晨。
有时可能是直接通宵,清晨出门吃个早饭回来补个觉,继续开工。

而在产品拿投资不顺利的时候,每天起床后,思考的最多的问题就是,我自己为什么要创业,以及生活的目的是什么。

最终,在尝试了多个方向后,融资失败,第一次创业结束。虽然这段旅程结束了,但是,
我想明白了我的问题的答案,于是我打点了下北京的事情,就回来了。

可能大家都觉得我是奔着感情回来的,其实,这里面的原因还是很多的。我想明白了生活的目的,所以我觉得在哪里都不再那么重要了。既然空间不再最重要,那么就回来多陪陪父母吧,也让父母安心。

离开帝都,返回老家

当在帝都的所有行李被我哥拉走时,我在帝都的最后一晚,在入睡前还是觉得不舍与怀念。怀念奋斗过的日子,怀念一起奋斗的人。回忆是美好的,但终究是不应该阻碍前进的脚步,生活还有很多东西等待去发现与经历。当回到老家的那刻起,新的生活就开始了。

我是无论如何也不会想到,最终还是要回到这个小地方。虽然人们常说造化弄人,其实还是我们自己选择了我们自己的生活态度和方式。

既来之,则安之,更何况是自己的老家,困难是会有的,但一定会被解决的。

感情

有时候,感情这个事情就是很奇妙。本以为回来后,可能就会顺顺利利的,但实际上还是很曲折的。有时候你在感情上付出了,不一定就会得到回报,也就是俗话说的热恋贴冷屁股。

没有想到,回来后没多久,就结束了一个也不怎么长时间的感情。之后,也闷闷不乐了许久。期间每天都在家做无器械健身,摆弄些之前毕业时想要开发的东西来消遣和调整自己。效果还是挺不错的:体重减轻了不少;开发了一个计划了3年的工具,也算埋了之前的坑;买了个http://novels.pw的域名,想着在这上面写点小说;整理下自己开发过的工具;成立了4年前想要成立的社团基金会,重新开始关注了比特币。

就当我在认为短时间不会再恋爱的时候,我购买了单反,计划着要去云南待一段时间,去实现下边工作边旅游的梦想。

她,出现了。

生活重新回到了一个正常的轨道上,愿一切都能顺顺利利。

工作

回老家后,首要任务就是工作。对于不喜欢公务员的我来说,继续本行工作是最大的目标。无奈的是,在这个三四线的小城市,一个程序员要干所有活且不说,却拿着比餐厅服务生高不了多少的薪水,实在是让人接受不了。最终,走上了远程工作的道路。

但是这条道,在小城市走起来也是很辛苦的,最重要的问题就是在老一辈的人群中,得不到认同,普遍不认为天天窝在家里是在工作挣钱。其实问题也很好办,那就是能稳定的挣很多钱,大家也就不会再说些什么了。

于是,还是要再上路,准备二次创业。折腾了两个多月注册了个公司,脑海中有几个备选方案,跟朋友讨论后,最终决定,把当年在计算所的时候,内部孵化夭折的一个项目重新拾起来。接下来的2016年就是折腾这个货了,愿我能在2016开张大吉,希望在6月份能完成100个天使用户的目标。

感谢

感谢爸妈一直对我的支持,无论我选择了什么,都支持我坚持下去。感谢我的她,在我最好的时间认识了你。感谢在帝都曾经帮助过我的人,因为你们我才在帝都顺风顺水。感谢社团的孩子们,有时候正是因为你们,我才有继续坚持下去的斗志。

2015结束。2016开始。

继上次我按照《解决百度爬虫无法爬取github page问题》中的方案实施后,我自己博客的搜索量在逐步的恢复中,如下图:

索引量在恢复

今天调整了我的vps上更新的方式。把之前的 jekyll 服务器关掉了,直接把 nginx 指向了 _site 目录,然后使用 github 的 webhook ,实现了本地 push 代码到远端的时候,可以让 vps 上的 jekyll 重新 build 新的静态文件。

这样就可以减少一个端口的开放和服务的运行了。

最近发现百度已经不收录我的博客了,感觉很奇怪,搞了一个星期的SEO都失败了,
最后在百度站长工具里,看到经常抓取失败,于是放到搜索引擎里搜了下,发现原来是github屏蔽了百度爬虫。

于是只能自己利用DNSPod来搭建个面向百度爬虫的子站了。

首先登陆自己的vps,然后安装ruby和gem,

1
yum install ruby ruby-devel rubygems

安装jekyll

1
gem install jekyll

结果报错,说ruby版本不够,妹的。。。卸载掉,从ruby官网下载源代码,进行编译安装,

1
2
3
#这里就只写编译命令了,基本依赖自己搞定吧
./configure --prefix=/usr/local --disable-install-doc --with-opt-dir=/usr/local/lib
make && make isntall

再次安装jekyll,成功,再安装各种扩展

1
2
3
gem install jekyll-gist jekyll-paginate redcarpet
pip install pygments
gem install pygments.rb

从github上pull博客的代码,启动jekyll,测试下看看能不能访问。
由于我这台vps上开着nginx,所以jekyll是启动在4000端口上了,那么在nginx上做个反向代理即可,
可以参照我之前写的这篇博文来配置:https://akawa.ink/2015/03/09/nginx-proxy-config.html.

接下来再配置crontab,让系统能自己pull代码

1
2
crontab -e
*/1 * * * * cd /home/wwwroot/blog; git pull > /dev/null 2>&1;

这里有个小插曲,由于我的vps空间是5G的,安装ruby的时候提示空间不足,
查了下发现,/var/spool/clientmqueue目录有2.9G之大,原因就是由于没有开启sendmail,
crontab执行后的结果输出无法发送邮件,就全部dump到这里了,解决方案就是在写crontab命令的时候,
如果需要输出结果,就指定到一个文件去,否则就直接用 >2>&1 丢掉即可。

最后一步,在DNSPod里面增加新的记录,记的把线路类型选择为 百度

这样再用百度抓取下,就成功了。

添加国内的源

1
Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo

增加ssh配置,允许root用户登陆

1
2
# 配置文件是 /etc/ssh/sshd_config
PermitRootLogin yes

更新系统

1
2
pacman -Syy
pacman -Syu

安装 vim , base-devel , wpa_supplicant , net-tools

1
pacman -S vim base-devel wpa_supplicant net-tools iw dialog wget git

安装yaourt

首先安装软件包组 base-devel , 以及 fakerootsudo 软件包,这样就不会在编译时缺少 gcc 或者 make 的问题。
安装 package-query:

1
2
3
4
5
6
7
$ wget http://mir.archlinux.fr/~tuxce/releases/package-query/package-query-1.7.tar.gz
$ tar zxvf package-query-1.7.tar.gz
$ cd package-query-1.7
$ wget https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=package-query
$ mv PKGBUILD?h=package-query PKGBUILD
$ makepkg -si
$ cd ..

安装 yaourtAUR:

1
2
3
4
5
6
7
$ wget http://mir.archlinux.fr/~tuxce/releases/yaourt/yaourt-1.7.tar.gz
$ tar zxvf yaourt-1.7.tar.gz
$ cd yaourt-1.7
$ wget https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=yaourt
$ mv PKGBUILD?h=yaourt PKGBUILD
$ makepkg -si
$ cd ..

今天弄到一个360的随身wifi,就想给树莓派安装上,这样就不用再用有线连接了。
由于我的 Archlinux 没有安装桌面环境,所以只能在命令行下配置。Arch在最近的版本中,
开始使用 systemd-networkd 进行网络管理了,具体可以看 Arch Wiki

检查驱动

分别执行 lsusb 和 lsmod 后,发现需要自己安装mod。
但是pacman包管理中的是 MT7601 的驱动,而 360wifi 的是 MT7601U,尝试安装了 MT7601,
使用 dmesg | grep mt7601 发现有err。于是看了下 Aur,发现 Aur 下有 MT7601U 的驱动,
于是又安装了下 yaourt 。使用 yaourt -S mt7601u-dkms ,安装后即可。

安装 wpa_supplicant

1
pacman -S wpa_supplicant

配置 wpa_supplicant

1
2
3
4
5
6
7
8
9
10
[root@alarmpi ~]# cat /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
fast_reauth=0
network={
ssid="your ssid"
key_mgmt=WPA-PSK
psk="your password"
priority=5
}

其中 your ssid 就是热点名称了,your password 就是热点的密码了。

配置 systemd-networkd

1
2
3
4
5
6
[root@alarmpi ~]# cat /etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
DHCP=ipv4

其中 wlan0 是我的设备名称,请替换成你自己的。

设置为开机自启 并 启动

1
2
systemctl enable [email protected]
systemctl start [email protected]

其他内容

如果你使用的是 RTL8188CUS 这个芯片的 wifi,那么可能会遇到下面的错误,

1
nl80211: Driver does not support authentication/association or connect commands

请先尝试下面的命令

1
2
# wpa_supplicant -B -i wlan0 -D wext -c /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
# dhcpcd wlan0

如果 wlan0 成功获取到 ip 地址,则证明需要使用wext模式,那么 systemd 的配置如下:

1
2
3
4
5
# vim /etc/systemd/system/[email protected]/wext.conf
-----
[Service]
ExecStart=
ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dwext
0%