记又一次搞崩服务器

记又一次搞崩服务器。使用“又”,是因为我搞崩不是一次两次了。我希望这是最后一次。 背景 使用Android连接服务器的时候,发现要比自己的mac速度快很多,于是十分好奇,打算研究一下是什么因素导致的。 流程 检查了app以后,判断应该是开启了fast TCP导致的,于是考虑在mac上也开启对应的fast TCP,但是效果并不是十分显著;于是再次排查,发现服务器端并没有开启fast TCP。 这就很奇怪了,为什么速度这么快呢?是因为对“同源”的加密方法有优化吗? 于是,自然而然的考虑是不是可以通过开启这个TCP加速来加速服务器。这就开启了噩梦的开端。因为需要3.7以上的Linux Kernel才支持这个特性,所以需要先升级内核。我的内核难道不应该是最新的吗?带着这个以为输入了uname sr,显示内核版本2.6*。惊奇,我的VPS内核这么旧吗?于是自然而然的想到要升级一下内核,并且理所应当的把升级内核的脚本apt-get install linux-kernel-lts-wily运行了一下。于是噩梦开始了。 OpenVZ本身是不支持升级内核的,所有的VM都使用同一个内核版本,因此这个命令导致了很神奇的BUG,安装内核装不上,卸载内核卸载不了。 这个时候我面临两个选择,一个是重新安装系统,一个是解决当前的这个问题。 经过简单地判断,我认为如果解决当前问题,可能花费我更多的时间,直接重新安装系统就可以了。重新配置一些相关措施也并不难。 失算的事情是,尽管我依稀记得一部分关于配置的内容,但是要完全复现我所配置的相关应用已经很难了,因为我没有做记录。于是来回又踩了许多坑,之前有些坑我有很明确的踩进去的记忆。 这就非常痛苦了,每次操作都在嘲讽自己的愚蠢与过度自信。最后,我只进行了简单的配置,只找回了部分的优化——记忆里我所做的优化就只有这些了,但是速度似乎下降了,这就是最终的结果。 这也让我想起《人月神话》里面描写的一句,具体我已经记不清了,意思大概是这样的:有些步骤你是必须要做的,只不过当前你没有做而已,以后是要补上的。我读到这个地方的时候,联想这个规律为“技术债”。 好了,以上就是我还“技术债”的全部过程了。 教训 研究问题虽然好,但是要注意花费的时间 在生产服务器上,不要做没有经过自查的操作。 不要被强迫症控制了,能用则用。 记录自己的行为日志,如果可以的话,写一个安装脚本 唉,真是一次不合格的运维行动。

Read More

谈论一下编辑器

编辑器这个东西,一直以来的目的,要么是装逼,要么是提升程序员工作效率。 做物联网开发使用终端下的vim编辑器的确是行云流水——省去了git push和git pull的过程。 不过仔细想来,真是工作了,恐怕使用这个东西频度就不行了。一方面,可以根据最近的一些更新,比如说vim的异步来提升一下插件的整体体验。工作环境是会变得,在配置编辑器上话费太多功夫总归是不划算的。现在正在体验spacevim—— spacevim载入以后没有对其leader的介绍,可能是出于照顾新手?这点我有点不适应——我还以为加载出来以后,就是一个类似于spacemacs的界面呢。 原来是需要使用neovim才能体现出spacemacs的效果 速度实在是太慢了。主要是VimFiler的缘故,拖的整体速度都很慢。 其实本来想要写,进入工作环境,恐怕就没有那么多时间去摆弄编辑器了。但是似乎编辑器涉及到的技术,也有许许多多是可以共通的,因此,研究起来应该也是有价值的。不过使用起来,还是一整个配置好的环境更加舒服——IDE就免了,感觉上还是太重了,有一定自由性还是好的。 sublime似乎是一款比较优秀的编辑器,使用python作为他的”脚本语言“,就像”lisp“之余emacs,”vimscript“之余vim一样。不过,习惯于vim的我不太想要重新去看一个新的编辑器的API了,总感觉有些麻烦。 写的比较杂乱,主要是最近没东西玩了,复试总不能打游戏吧,只好研究个什么。——以考试为目的学习,真累啊。

Read More

跨站评论系统

多说马上就关闭了,静态站的评论系统何去何从。 首先想要分析一下duoshuo的代码,看看自己能否实现。 不过,在看duoshuo客户端代码的时候没有搞明白到底是如何实现确认目标来源的。 <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名"}; (function() { var ds = document.createElement('script'); ds.type = 'text/javascript';ds.async = true; ds.src = 'http://static.duoshuo.com/embed.js'; ds.charset = 'UTF-8'; (document.getElementsByTagName('head')[] || document.getElementsByTagName('body')[]).appendChild(ds); })(); </script> <!--多说js加载结束,一个页面只需要加载一次 --> 似乎是自己生成生成一条Javascript代码,然后把head以及body加在上面,进而出一个界面。 embed.js就没有再看,好麻烦。 isso 在网上寻找一个合适的开源评论系统isso,可以自己搭建在主机上,使用Python+SQlite3实现。具体实现在其开源的代码中。 涉及到的知识有几个,一个是CORS,另一个还是CORS。 个人认为知识储备基本有了,但是如果要写还是很麻烦,于是就暂且弃坑了。 可以通过这个docker来部署wonderfall/isso,不过感觉docker-compose似乎存在问题,我无法直接挂载./config:/config,因此对于domer-compose中做此修改...../config/isso.conf:/config/isso.conf。 此外,对于Flask实现这个留言系统,可以考虑通过flask-cors来实现。

Read More

软件设计模式 — 单例模式

单例模式确保某个类只有一个实例,而且自行实例化,并向整个系统提供者个实例,提供一个访问它的全局访问点。 核心是:创造私有的构造函数 例如:只有一个实例的东西。 Singleton.java package singleton; public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() { // 限制产生多个对象 System.out.println("已产生对象实例"); } public static Singleton getInstance() { // 通过该方法获得实例对象 return singleton; } public static void operation() { // 类中其他方法,尽量是static } } Client package singleton; public class Client { public static void main(String[] args) { System.out.println("Start."); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); if (obj1 == obj2) { System.

Read More

软件设计模式 — 行为型模式

代码全部贴在github。因为UML图挂在processon上了,不过没有加连接。等写完全文就把链接加上。 首先是对象的行为模式: 1. 策略模式 针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使得他们可以相互替换。 2. 状态模式 改变类中的状态。 策略模式和状态模式很像,不同在:状态模式解决内在状态的改变,策略模式解决内部算法的改变。感觉上没什么特别大的区别。- -。 3. 命令模式 类的行为模式: 1. 模板方法模式

Read More

软件设计模式 — 适配器模式

4该模式的目标是,通过一个代理(Adapter),在原来的类(Adaptee)和客户(Client)之间进行协调,从而达到兼容的目的。 例如:我的项目中Davinci中使用的模式,将整体的游戏类作为Adapter,把用于通讯的Server类作为成员变量(也就是ObjectAdapter)。 示意代码 package adapter; interface Target { public void request(); public void specRequest(); } class Adaptee { //适配者 public void specRequest() { System.out.println("this is specRequest."); } } class ClassAdapter extends Adaptee implements Target { public void request() { System.out.println("This is request in ClassAdapter."); } } class ObjectAdapter implements Target { private Adaptee adaptee = new Adaptee(); public void request() { System.out.println("this. is request in ObjectAdapter."); } public void specRequest() { adaptee.

Read More

近日事项

最近因为考研准备一直都没有更新blog。考研复习进度已经非常糟糕了,但愿别出什么差错。。 宿舍直播视频网络搭建 宿舍的网络实在是太坑爹,赛尔垄断也就不多说了,联通这个传说中4M的网络平均速度200K/s也真是让人醉了。于是弄了个信号接收器直接收校园WLAN,效果不错。没错就是小盘子。型号是3070,买的时候也没有多做考虑,来了以后才发现能适配win10,也是吓尿了,等了5天没有网络着实太痛苦了。来了以后通过猎豹wifi共享多次不成,不是无法建立热点,就是建立好了,密码死活不对。后来尽管建立成功加入成功了,视频共享功能又不能愉快地使用。 尽管远程操作十分诱人,但是明显不足以弥补这缺陷,于是换成了wifi链接精灵。 其实win10本身也是自带软AP的,但是windows命令行操作,我并不是很熟悉,所以暂时没有用,毕竟我们要考研学习啊! – 视频播放软件一直都没有明确。最一开始的使用Samba(网上邻居)+ 一些samba播放器。小视频用起来还可以,大视频就不行了(你懂得)。研究了一下应该不是路由器的限制(当时还是通过宿舍路由进行共享的),感觉应该是windows本身smb的限制,加上ios上面除了威动播放器以外,其他的播放器使用samba都需要收费,就没有继续使用下去。后来身为开源软件脑残粉的我在使用VLC的过程中发现有plex media这个选项,于是开心的google+百度云盘下载了一个plex server,使用起来感觉比网上邻居要流畅。配置方面非常简单,直接安装即可,然后添加媒体文件夹,更新下数据库即可。仔细观察下后端还是我大Python = =。lol。ios上官方的客户端只能看1min的电影,不是,考研视频。所以还是建议使用开源的vlc。android就无所谓了,简单搜索下发现有破解版,也就没有仔细看了。此外,Plex还有Linux版本,性能应该差不多 — 因为后面都是Python。总而言之是能看了。 后来又倒弄了一下,因为宿舍的宽带不能使用了,路由器就成了玩具 — 仔细观察发现路由器的系统就是嵌入式的Linux啊。。当初还以为是特别开发的什么什么系统,按照赵老师所说,思科的大型路由器路由表都固化成硬件了等等。然而,小小的tp-link是没有那么大的本事的。就是个简单的嵌入型linux。其实一开始脑洞开的时候,想通过刷个开源的openwrt到路由器中,来共享WLAN作为全宿舍上网的桥梁,但是研究后发现愚蠢的WR875不能刷openwrt。悲伤。其他的什么扩展系统就更别提了。因为本身不是学习嵌入式的,自己制作感觉不现实。驱动什么的就弄不好。(问题应该就在驱动上,拆了tplink的官方包?反正我是没有去做过。。看硬件配置应该是可以的)。再后来动心思到我的小小树莓派上,但是我没有无线网卡。。我的小米随身WIFI还因为下海挂掉了。所以只得作罢。如果有时间倒是真的可以考虑下搞个无线网卡,给树莓派刷个openwrt或者更加粗暴的Debian来提供网络。说了这么多我想大家也是明白了小米路由的大体原理了。我觉得八九不离十就是个小的设备,搞了个高大上的路由系统。当然也只是我个人认为,没有什么依据,毕竟我没钱玩小米路由(微笑)。 后来在自己的电脑上搭建了一个非常简单的DHCP服务器,准备利用win10自带的桥接功能,给路由器的WAN口插上,直接把路由器当成外置WIFI使用,发现的确可以。有兴趣的同学可以试试。bing搜索 dhcp for windows.即可。路由设置我就不说了。路由器又愉快地利用起来了。。 毕竟我们要考研学习啊! 不过把电脑当做视频服务器似乎会减少硬盘寿命。。= =。我的天。 最近的吐槽 昨天简单的看了看坚果手机发布会后的新闻报道。看见一个支持开源项目等等等。不知道小米等公司支持了没说还是怎的,锤子拿出来我就感觉很有逼格,瞬间路转粉。当然粉也没什么用处。坚果手机应该分期12个月是买的起的,但是手里有着粑粑买的肾6,再买个坚果纯粹是作。所以暂时作罢。估计坚果很讲究情怀的话,也没什么可以玩的地方吧。要是能刷ubuntu那也是屌屌哒。SSD存储的话就不担心坏道了= =。 *

Read More

近期算法笔记

算法书籍 莫队算法 最大团 最短路 A _搜索算法——图形搜索算法,从给定起点到给定终点计算出路径。其中使用了一种启发式的估算,为每个节点估算通过该节点的最佳路径,并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此,A_搜索算法是最佳优先搜索的范例。 集束搜索(又名定向搜索,Beam Search)——最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过,集束搜索只能在每个深度中发现最前面的m个最符合条件的节点,m是固定数字——集束的宽度。 二分查找(Binary Search)——在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。 分支界定算法(Branch and Bound)——在多种最优化问题中寻找特定最优化解决方案的算法,特别是针对离散、组合的最优化。 Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。 数据压缩——采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。 Diffie-Hellman密钥交换算法——一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。 Dijkstra算法——针对没有负值权重边的有向图,计算其中的单一起点最短算法。 离散微分算法(Discrete differentiation) 动态规划算法(Dynamic Programming)——展示互相覆盖的子问题和最优子架构算法 欧几里得算法(Euclidean algorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。 期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算,第一步是计算期望,利用对隐藏变量的现有估计值,计算其最大可能估计值;第二步是最大化,最大化在第一步上求得的最大可能值来计算参数的值。 快速傅里叶变换(Fast Fourier transform,FFT)——计算离散的傅里叶变换(DFT)及其反转。该算法应用范围很广,从数字信号处理到解决偏微分方程,到快速计算大整数乘积。 梯度下降(Gradient descent)——一种数学上的最优化算法。 哈希算法(Hashing) 堆排序(Heaps) Karatsuba乘法——需要完成上千位整数的乘法的系统中使用,比如计算机代数系统和大数程序库,如果使用长乘法,速度太慢。该算法发现于1962年。 LLL算法(Lenstra-Lenstra-Lovasz lattice reduction)——以格规约(lattice)基数为输入,输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用:背包加密系统(knapsack)、有特定设置的RSA加密等等。 最大流量算法(Maximum flow)——该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关,这就是最大流-最小截定理(Max-flow min-cut theorem)。Ford-Fulkerson 能找到一个流网络中的最大流。 合并排序(Merge Sort) 牛顿法(Newton’s method)——求非线性方程(组)零点的一种重要的迭代法。 Q-learning学习算法——这是一种通过学习动作值函数(action-value function)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。Q-leanring的优势是,在不需要环境模型的情况下,可以对比可采纳行动的期望效用。 两次筛法(Quadratic Sieve)——现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法Number Field Sieve)。对于110位以下的十位整数,它仍是最快的,而且都认为它比数域筛法更简单。

Read More