本文翻译了Colin Percival 于2010年在bsdcan的演讲ppt
原文标题:Everything you need to know about cryptography in 1 hour
演讲时间:May 13, 2010
原文在 https://www.bsdcan.org/2010/schedule/attachments/135_crypto1hr.pdf
演讲视频在 https://www.youtube.com/watch?v=jzY3m5Kv7Y8 ( 请自行翻墙 )
Colin Percival 是密码学方面的专家,FreeBSD项目的安全长官,Tarsnap在线备份服务的创始人,scrypt密钥衍生算法的作者,致力于改进软件中密码学的应用,向程序员传播密码学的正确使用。
一,简介 # jump consistent hash是一种一致性哈希算法, 此算法零内存消耗,均匀分配,快速,并且只有5行代码。
此算法适合使用在分shard的分布式存储系统中 。
此算法的作者是 Google 的 John Lamping 和 Eric Veach,论文原文在 http://arxiv.org/ftp/arxiv/papers/1406/1406.2294.pdf
完整代码:
int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) { int64_t b = -1, j = 0; while (j < num_buckets) { b = j; key = key * 2862933555777941757ULL + 1; j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1)); } return b; } 输入是一个64位的key,和桶的数量(一般对应服务器的数量),输出是一个桶的编号。
本文是关于SSL/TLS的 CipherSuite 的信息摘录,翻译。如有疑问,欢迎指出。
一,CipherSuite的概念 # CipherSuite 这个名词目前没看到有好的中文翻译,个人觉得翻译成“加密算法套件”比较合适。Cipher泛指是密码学的加密算法,例如 aes, rsa, ecdh 等。 tls是由各类基础算法,作为原语组合而成。 一个CipherSuite是4个算法的组合:
1个authentication (认证)算法 1个encryption(加密)算法 1个message authentication code (消息认证码 简称MAC)算法 1 个key exchange(密钥交换)算法
在单元测试中,我们需要提供业务逻辑的mock版本, 当业务逻辑实现为C++的virtual function时,这是很容易的,我们只需要写一个子类, 实现virtual function就行了,Google 的 gmock就针对这种情况设计。
问题 # 可是,如果遗留代码中有一般C函数,非virtual的类成员函数,模板函数,inline函数,如何提供mock版本呢?
下面的代码用一点trick实现了上述函数的运行时mock。
近日需要给服务器做备份,在网上找到了一个现成的金山快盘的api:https://github.com/deren/python-kuaipan (感谢!)
试了一下,遂决定备份到金山快盘上。
简单几行 python 代码实现一个 http 代理
libpcap驱动了tcpdump,和wireshark这类抓包工具.提供了高度灵活的包过滤语言. 据wikipedia,高性能的包过滤最早是在bsd上作为一个问题被解决,被称为bpf,在内核实现了一个解释器,进行包匹配,用户态提供一个字符设备, linux作为后来者,支持与bsd基本相同的packet filter,称为lpf,不同的是,linux是通过在一个raw socket来支持包过滤的,通过setsockopt来SO_ATTACH_FILTER,挂载过滤器. strace 可知,libpcap实际上进行了如下syscall:
socket(PF_PACKET, SOCK_RAW, 768) = 59 setsockopt(59, SOL_SOCKET, SO_ATTACH_FILTER, "\1\0\0\0\0\0\0\0\250\327Vc\375\177\0\0", 16) = 0 参考资料 # libpcap的api文档和demo代码可以参见
http://www.tcpdump.org/pcap3_man.html http://www.tcpdump.org/sniffex.c 实现 # 参考文档了demo,我写了一个小的sniffer,
目标:实现一个算法,模拟在一个封闭二维区域,圆形小球朝给定方向坠落的过程,实现二维区域的紧密填充。
像下面这样:
难点,及其简单解决:
1.如何把粒子移动尽可能远?
图中的粒子i,能往下移动多远?一般情况,碰撞?边界?
一个简单解法:
一个基于约束传播的,玩具级微型计算语言的设计和简单实现。
这个程序就是做来玩和练习的,代码是玩具级别的,用的python,基本可以正常工作了。
一,应用背景 # 先介绍应用背景:
在流体机械设计中,通常根据性能参数进行设计,算出其它变量,但问题是,在设计过程中,需要进行变量的手工调整,例如圆整,修正到某一范围,校核等等。
其计算模式举例如下:
1.定义变量,如输入压力Pin=0.98,输入温度Tin=27,输入流量Qvin=400,kv2,φ2r,b2,D2,u2,qin等等。。。
2.根据某些物理公式,算出几个新的量,如转速 n=33.9*sqrt(kv2*φ2r*b2/D2*(u2^3)/qin)
3.把n从8296.93圆整为整数8300,
4.重新计算b2/D2=0.06455,校核可知0.02<0.06455<0.065,符合要求
5.根据n计算出其它新的变量,修正,校核。。。
。。。
二,用约束传播系统建模 # 观察可以发现,这种计算模式,和《计算机程序的构造与解释》中提到的约束传播系统很像,如果把一个变量看作一个对象,那么,当它位于一个公式的左侧,例如n,也就意味着,右侧变量例如kv2更新时,应该给它发送一个消息,让它重新计算自己的值,当n更新后,如果它发现有别的变量依赖于自己,它应该发消息通知它们更新自己的值。
还可以看出,这种依赖关系形成了一个图,例如应该有一条从kv2到n的边,把n称为kv2的订阅者。
所以这种计算模式可以用约束传播系统建模,但是此处和书里的约束传播系统有差异:此处的约束传播系统是有向图,而书里是无向图,设计成有向图主要是为了简单,无向图的消息发送顺序是难以控制的,而且构造的时候公式中的每个变量都要持有其它对象的引用,太麻烦,有向图只需要在公式左侧的那个变量哪里保存公式右侧的每个变量的引用。
形成有向图后,每个变量的状态设为invaild,这种状态下,不会向它的会订阅者发送更新消息,收到获取值的消息时报错。
有向图中,还有一些源点,是最初给定值的变量。
当某个变量被赋值时,它把自己设为新值,同时向它的订阅者发送更新消息。订阅者计算自己的新值,如果和旧值相同,就沉默;否则,更新自己,通知订阅者更新。
so,想象一下,在你的面前,虚空之中漂浮着一张有向图, 由kv2—>n这样的一条条边练成,当一个点被赋予值,从这点荡出一圈圈涟漪,传到它的下一级,再从更新过的点荡出新的波纹,传开,传开。。。直到所有的点都收敛,水面恢复宁静。
本文译自 “Deriving the Y Combinator in 7 Easy Steps“,
原文链接:http://igstan.ro/posts/2010-12-01-deriving-the-y-combinator-in-7-easy-steps.html
在没有原生递归支持的语言中,Y结合子(Y Combinator)是一种实现递归的方式(事实上,它更常被作为一种锻炼程序思维的方式)。要实现Y结合子,要求这种语言支持匿名函数。
此处,我选择JavaScript来推导Y结合子,从递归阶乘函数的定义开始,一步一步进行变换。
Step 1 # 最初的实现,使用JavaScript内建的递归机制。
var fact = function (n) { if (n < 2) return 1; return n * fact(n - 1); }; Step 2 # 获得递归的最简单方法是什么?我们可以定义一个函数,它接受它自身作为参数,并且用这个参数作为参数,调用这个参数。当然,这是一个无限循环,会导致栈溢出。
(function (f) { f(f); })(function (f) { f(f); }); 我们的阶乘函数套用上面的模板,再做点改动,阶乘函数接受一个我们还不知道的参数,所以我们要的是返回一个接受该参数的函数。然后这个函数可以被用于计算阶乘。同时,这可以让我们的阶乘函数不会无限循环下去。
var fact = (function (f) { return function (n) { // 终止条件 if (n < 2) return 1; //因为f返回一个函数,所以这有一个双重调用。 return n * f(f)(n - 1); }; })(function (f) { return function (n) { // 终止条件 if (n < 2) return 1; // 因为f返回一个函数,所以这有一个双重调用。 return n * f(f)(n - 1); }; });
import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import org.postgresql.ds.PGSimpleDataSource; import oracle.jdbc.pool.OracleDataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class DBConnection { /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { // TODO Auto-generated method stub MysqlDataSource mysqlDataSource = new MysqlDataSource(); // mysqlDataSource.setPassword("dev"); // mysqlDataSource.setUser("dev"); mysqlDataSource .setURL("jdbc:mysql://localhost/forJava?user=dev&password=dev"); Connection conn = mysqlDataSource.getConnection(); Statement stmt = conn.createStatement(); stmt.executeUpdate("create table if not exists web\n" + "(\n" + " id int not null primary key,\n" + " name varchar(100),\n" + " created timestamp,\n" + " content blob\n" + ");\n" + ""); for (int i = 0; i < 1; i++) { stmt.executeUpdate("insert into web (name,content) values ('HL','frgertrhrtnthtohioh')"); } showResultSet(stmt.executeQuery("select * from web limit 10")); // Driver driver = new com.mysql.jdbc.Driver(); // driver.connect("jdbc:mysql://localhost/forJava?user=dev&password=dev", // null); PGSimpleDataSource pgSimpleDataSource = new PGSimpleDataSource(); pgSimpleDataSource.setServerName("localhost"); pgSimpleDataSource.setDatabaseName("dev"); pgSimpleDataSource.setUser("dev"); pgSimpleDataSource.setPassword("dev"); conn = pgSimpleDataSource.getConnection(); // conn = // DriverManager.getConnection("jdbc:postgresql://localhost/test", // "dev", "dev"); showResultSet(conn.createStatement().executeQuery("select * from cities")); OracleDataSource oraDataSource = new OracleDataSource(); // oraDataSource.setServerName("127.0.0.1"); // oraDataSource.setDatabaseName("HR"); // oraDataSource.setUser("HR"); // oraDataSource.setPassword("HR"); oraDataSource.setURL("jdbc:oracle:thin:hr/hr@//localhost:1521/XE"); conn = oraDataSource.getConnection(); stmt = conn.createStatement(); stmt.execute("select * from tab"); showResultSet(stmt.getResultSet()); stmt.execute("select * from jobs"); showResultSet(stmt.getResultSet()); stmt.execute("select * from DEPARTMENTS"); showResultSet(stmt.getResultSet()); } static void showResultSet(ResultSet resultSet) throws SQLException { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); int num = resultSetMetaData.getColumnCount(); while (resultSet.next()) { for (int i = 1; i <= num; i++) { System.out.print(resultSetMetaData.getCatalogName(i) + " " + resultSet.getString(i)); } System.out.println(); } } } 呃,在自己电脑上同时安装了mysql, postgresql,oracle,db2,sqlite的人是不是很蛋疼?
小项目,练手的。
1.使用了java.util.concurrent包里的线程池,可以飙升到满带宽,在100M带宽上,可以达到10MB/s。
传热过程数值模拟(《传热学》实验指导书第四部分第一题,第一,第二类边界条件)
问题背景 # 2010年十月写的旧代码。
第一类边界条件是给定边界温度。
第二类是对流边界。
区域都是如下形状的:
-------------------------------- | | | | | | | ---------------------- | | | | | | | | | | | | | | | | --------- 用C++纯属蛋疼。
思路类似 http://bazaar.launchpad.net/~lenzgr/mylvmbackup/trunk/view/head:/mylvmbackup.pl.in
#!/bin/sh bk_to="/var/mysql-backup-`date +%Y-%m-%d-%k-%M-%S |tr -d ' '`" user_name="root" user_pw="dev" sql=" flush tables with read lock; system cp -pR /var/lib/mysql $bk_to; unlock tables; " mysql -u $user_name -p$user_pw -e "$sql" echo $sql tar cjf $bk_to.bz2 $bk_to rm -rf $bk_to
我不喜欢fortran,
奇怪的词法规则(竟然不用空格分开token),
io操作竟然是语言的一部分(这种非本质的东西像C那样用库来扩展多好)
就不贴matlab代码了,图比较大。
分别是:
无环量流动
有环量流动,两个滞止点
有环量流动,一个滞止点
有环量流动,柱面外一个滞止点
这是2011年8月份做过的一点实验,查了MSDN等等很多资料,基本搞明白了。
这里我不会使用visual studio的图形界面工具,作为专业人士,还是搞懂自己的工具是怎么运转的,这样比较好。