自己动手搭建第三方的Codeforces CDN

啥?

校园网上CF那叫一个卡。

原因是什么呢? 因为codeforces大量的使用了ajax技术,所以引用了很多js/css文件,并且引用的位置位于页面之前。

这就造成了,我们在上CF的时候,其实页面内容已经读取出来了。但是因为js/css文件没有加载完成,所以页面还是一片空白。

解决方案

由于js/css/img文件都是所谓的静态文件,那么我们可以缓存这些文件到一个访问速度快的网络上来。

这就是CDN技术。

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度

但是俄罗斯人那边没有做CDN,或者他们的CDN距离天朝实在是太远了。

所以我们只好手动缓存这些静态文件到七牛云上,使用七牛的CDN技术来加速我们的访问了。

七牛云为个人用户提供了10G存储空间和每月10G流量,这对于我们缓存一个网站的静态文件来说,已经足富裕了。根据我现在的使用状况,所有静态文件加在一起大概在3M左右,搭建这样一个免费CDN可以供十几个人使用。

设计架构

我们使用CS模式来完成这个网站加速的任务。

Server端当然就是七牛云啦。复杂的任务都交给了工程师们完成,我们只需要声明需要缓存codeforces.com …

more ...


Codeforces Round #218 (Div. 2)不完全不正确题解

A. K-Periodic Array

将Array切片,然后按位统计某一位上1的个数C(1)和2的个数C(2)。然后在这一位上的操作数就为M = min(C(1), C(2))。

简单题

B. Fox Dividing Cheese

傻逼才错的题,不幸中枪。

不想多说了,直接看代码吧。手贱不是病,贱起来要人命。

C. Hamburgers

模拟 + 二分。

和CJL还讨论过这题的纯模拟做法,看了半天代码没找到问题。于是刚才用Python自己实现了一个,在代码正确的情况下,没有WA,但是T在了22组上。

所以这题最好使用二分,如果用模拟的话,需要考虑各种情况。代码见下,细节上注意就好。

D. Vessels

这题得好好讲一下~比赛时做出来了好得意~

Vessels

题意是给出一组层层叠的容器,每一个容器都有自己的容量。然后我们向某些容器里灌水,如果水的体积超过了某个容器的容量,则剩余的水溢出到下一个容器中。最后一个容器溢出的水会落到地面上 …

more ...

使用新类型创建更人性化的代码

啥?

这篇文章讨论了如何通过新建并非”必要“的新类型,来产生更人性化的C++代码。

关键词:

  • RAII
  • 智能指针
  • 接口友好
  • 模板
  • 模板特化
  • 依赖编译器的缺省行为

对于C++的艺术,我只是个入门者。如果文章中有什么问题,欢迎大家指出,我会及时进行修改。

一个友好的互斥锁

互斥锁的定义

互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区域(critical section)达成。临界区域指的是一块对公共资源进行访问的代码,并非一种机制或是算法。一个程序、进程、线程可以拥有多个临界区域,但是并不一定会应用互斥锁。

如何使用互斥锁

这里只做最简单的示范。具体的使用方法和原理不在本文的讨论范围之内。

#include <pthread.h>

class MyIntArray …
more ...

Yunfile下载破解[废弃]

废弃原因

因为Yunfile现在开始限IP + 无限抽风,所以插件已经废弃不用了。现在也没找到解决方法。\o<(=╯□╰=)>o

啥?

大家都知道Yunfile是做什么的咩?反正我是不知道。。。

今天下午无聊,写了一个yunfile下载的破解插件。

功能:

  • 非会员跳过下载等待的30s(或者更长时间)

  • 下载页面不会报“因长时间未操作,需要重新下载”的错误

这里感谢luacloud博文,为插件的编写提供了原型。

具体功能实现:

跳过等待

在上面引用的博文里面有说,就是强制执行页面中的js,实现跳转。

还做了一个DOM修改,变成现在这种很漂漂的样子~~

Yunfile-Craker-1

忽略超时错误

覆盖了下载函数,跳过超时判断。

现有问题

在一些情况下,点击下载按钮会返回到下载页。

虽然我们不需要再等30s了,但是还是很烦。

也有我有机会修复这个问题。

代码

代码在这里呀~

more ...


機器學習基石 - PLA算法初步

什么是PLA算法

PLA = Perceptrons Learning Alogrithm

WikiPedia上有一个大概的历史背景介绍。

感知机(英语:Perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。

PLA算法的原理

感知机示意图

对于每种输入值(1 - D),我们计算一个权重。当前神经元的总激发值(a)就等于每种输入值(x)乘以权重(w)之和。

由此我们就可以推导出公式如下。

neuron sum

我们可以为这个“神经元”的激发值设定一个阈值threshold

如果 a > threshold,则判定输入为正例。 如果 a < threshold,则判定输入为负例。 对于 a == threshold的情况,认为是特殊情况,不予考虑。

所以,我们的感知器分类器就可以得到以下式子 …

more ...

Linux内核中的少锁链表

前言

最近在stackexchange上看到一个问答,讨论我们常用的数据结构与算法在实际工程中的应用。(戳我)

我打算借助这个问答中的内容,以我比较熟悉的数据结构与算法为索引来阅读开源代码。

正文

Talk is cheap

Lock-less NULL terminated single linked list

linux-2.6/include/linux/llist.h

linux-2.6/lib/llist.c

知识准备

volatile

volatile关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性。

通常,volatile关键字用来阻止(伪)编译器对那些它认为变量的值不能“被代码本身”改变的代码上执行任何优化。

如果不使用volatile关键字,编译器将假设当前程序是系统中唯一能改变这个值部分。 为了阻止编译器像上面那样优化代码,需要使用volatile关键字。

From: http://zh.wikipedia.org/wiki/Volatile%E5 …

more ...

Codeforces Round #215 (Div. 2)不完全不正确题解

A. Sereja and Coat Rack

傻逼才错的题。不幸中枪。

没什么可说的。直接看代码就好。

B. Sereja and Suffixes

关键思想在于统计A[i...n-1]中有多少互不相同的数。

使用离线思想,把查询按greater<int>排序,然后使用Hash表进行统计,简单题。

C. Sereja and Algorithm

思路题。

我们容易想到如果可以交换相邻两个字母的位置,我们就可以获得这个字符串所有的排列。

所以我们只需要统计出A[i...j]中x, y, z的个数。

然后进行排列。

我们可以推出,稳定的排列(即可以使算法停下来的排列)只有如下几种情况。

zy[xzy][xzy]...
xz[yxz][yxz]...
yx[zyx …
more ...

CSE351 - Lab 1: Manipulating Bits Using C

今天做了CSE351 - Lab1,深深的感觉国外的计算机教学爆了我校一条街。

以上是前言。


bitAnd & bitOr

德摩根定理的应用

/* 
 * bitAnd - x&y using only ~ and | 
 *   Example: bitAnd(6, 5) = 4
 *   Legal ops: ~ |
 *   Max ops: 8
 *   Rating: 1
 */
int bitAnd(int x, int y) {
  return ~(~x | ~y);
/* 
 * bitOr - x|y using only ~ and & 
 *   Example: bitOr(6, 5) = 7
 *   Legal ops: ~ &
 *   Max ops: 8 …
more ...