linux系统编程

本文为"linux c编程一站式学习"一书的笔记 文件与I/O 再来一个hello world 我也来写一段汇编的hello world .data msg: .ascii "yuanhang zheng\n" len = . - msg .text .global _start _start: movl $len, %edx movl $msg, %ecx movl $1, %ebx #1 is stdout movl $4, %eax ...

阅读更多
Linux c编程一站式学习笔记:C语言基础

本文为"linux c编程一站式学习"一书的笔记 程序和编程语言 平台这个词有很多说法,可以指计算机体系结构,也可以指操作系统,也可以开发平台( 编译器,链接器等)。 机器语言称为第一代语言1GL,汇编为2GL,C/C++,JAVA,Python等称为3GL,目前已经有 了4GL和5GL,4GL以后的语言主要描述做什么,而不是一步步怎么做,SQL就是这样的。 思考题:解释执行的语言比编译执行的语言有什么优缺点? 优点 执行过程简单,不需要通过编译阶段,直接解释执行 缺点 速度慢,缺少编译阶段的优化 依赖平台 自然语言和形式语言 基本概念 自然语言...

阅读更多
Linux c编程一站式学习笔记:C语言本质

本文为"linux c编程一站式学习"一书的笔记 计算机中数的表示 二进制数表示法 LSB称为第0位而不是第1位,所以如果一个数是32位,则MSB称为第31位。 sign and magnitude表示法: 第一位为符号位,在做加法运算时,需要这样: 如果符号位相同,则符号位不变,其他位相加,在不溢出的情况下得到结果。 如果符号位不同,则先比较非符号位谁大,然后用大数减小数,最后符号位 和大数的相同,这样就保证了结果的正确性。 !!这种方法,效率低,而且0的表示不唯一,既可以表示为1000 0000也可以表示 为0000 0000 1's compleme...

阅读更多
鸟哥的linux私房菜笔记:计算机概论

本文为"鸟哥的linux私房菜基础学习篇(第三版)"一书的笔记 计算机常识 原来Eeepc就是现在所说的上网本netbook. 原来作者所说的卡片阅读器就是读卡器(card reader) 读卡器要读SD卡,SD卡是什么呢?原来是secure digital memory card, 安全数码卡。 计算机的五大组成单元 输入单元 算术逻辑单元 控制单元 存储单元 输出单元 当然,这是基于冯诺依曼体系结构的。 CPU的种类 RISC,reduced instruction set computing,精简指令集 这种CPU主要代表是Sun的SPARC, IBM的Po...

阅读更多
linux系统初识

常识 当命令太长时,可以使用反斜杠\来防止按RET执行命令,能在下一行继续输入 可以用分号;来分隔命令,因为可以在同一行输入多个命令 显示日历:cal man man中查询的项后面的数字的含义: 数字 含义 1 shell命令或可执行文件 2 系统调用 3 C函数库 4 设备文件 5 配置文件 6 游戏 7 协议 8 管理员可用的命令 9 和kernel有关的文件 如:man fstab, man NULL 其中1,5,8特别重要,但是怎么记住呢?man ...

阅读更多
鸟哥的linux私房菜笔记:linux是什么&主机规划

本文为"鸟哥的linux私房菜基础学习篇(第三版)"一书的笔记 概念 原来BSD是指Berkeley Software Distribution. System V是AT&T自家的Unix LSB, Linux Standard Base FHS, File system Hierarchy Standard 常识 常见设备的文件名: 设备 文件名 IDE硬盘 /dev/hd[a-d] SCSI/SATA/USB磁盘 /dev/sd[a-p] 软盘 /dev/...

阅读更多
矩阵基础知识

为了实习的笔试面试,一定要把以前丢掉的数学全部找回来,于是开始了复习之旅。 基本知识 矩阵能相乘if and only if第一个矩阵的列数等于第二个矩阵的行数。 在台湾,矩阵的行和列和我们的相反,他们横向称为“列”,纵向称为“行”。 行数是1的矩阵称为行向量,列数是1的矩阵行为列向量。 矩阵的数乘(scalar multiplication)。 矩阵的转置(transpose),把矩阵的行向量变成列向量。 线性方程组是矩阵的主要应用,如下的线性方程组: a1,1 x1 + a1,2 x2 + ... + a1,n xn = b1 a2,1 x1 + a2,2 x2 + ... + a2,...

阅读更多
learn python the hard way笔记

本文为"learn python the hard way"一书的笔记 方法 在python交互窗口中,打help(),会进入帮助模式,这里可以查看所有的文档, 比如打modules会列出所有的模块,打函数会列出函数名,打关键字会列出关键字 的说明。按q退出。 不进入help模式,直接help(object)也可以查看相关的帮助。 在终端,通过pydoc工具可以查看文档。 要多读代码,试图理解别人的代码,不懂就去查。 输出 通过下面的练习: print "Hello World!" print 'Yay! Printing.' print...

阅读更多
elisp笔记:运算

声明:此文章为学习xahlee 的elisp教程 而写的笔记。 数学计算基础 运算符也是函数 和其它函数式语言一样,elisp中,加减乘除也是一个函数。我做了下面的练习: ELISP> (+ 1 1) 2 ELISP> (+ 1 2 3) 6 ELISP> (+ 1 2 3 4) 10 ELISP> (- 4 1) 3 ELISP> (- 4 2 1) 1 ELISP> (* 3 3) 9 ELISP> (/ 2 1) 2 ELISP> (/ 1 2) 0 ELISP> (/ 1.0 2) 0.5 ELISP> (% 5 3) 2 E...

阅读更多
elisp笔记:introduction

lisp历史 原来lisp是list processing language,1950s后期推出,主要为了研究人工智能。 数据类型 概述 每个对象至少属于一种类型 对于打印出来的对象,一般都可读,但是有一些是不可读的.这些对象以hash表示法表示。 即以#<开头,以>结束。比如: (current-buffer) #<buffer *scratch*> 在elisp中有两大类类型 用于lisp编程的类型 用于emacs编辑的类型 整型 在32位机器上,整型是30位,即-2 ^ 29到2 ^ 29 - 1,64位的会提供更多,但是官方 文档没有说明。...

阅读更多
org-mode介绍

什么是org-mode org-mode是用来写笔记,维护todo列表,写项目计划的。 文档结构 大纲 TAB键绑定在命令org-cycle上,它会在下面3个状态之间循环: -->折叠-->显示孩子-->显示子树-->折叠... C-u TAB键绑定在命令org-global-cycle上,它会在下面3个状态之间循环: -->总览-->显示内容-->显示全部-->总览... 标题 一个*表示一级标题,二个*表示二级标题,三个*表示三级标题,没有多于3个*的。 注意,*必须顶格写,而且*后面必须要跟一个空格。后面的字体颜色会改变。 动作...

阅读更多
org-mode 内嵌LaTex

特殊符号 在表示数学公式上特别有用。比如要表示alpha和beta,则这样: \号后面加alpha,\号后面加beta 为了补全,原来是绑定在了M-TAB上的,但是这个键我绑定在了切换窗口上,于是 把它改成TAB好了: (global-set-key (kbd "TAB") 'pcomplete) 但是这样是看不到这个特殊字符的样子的,通过 C-c C-x \ 进入可以查看UTF8字符的模式,就可以查看了。再使用一次快捷键,恢复原来的模式。 但是那么多字符,我怎么找呢?可以通过: M-x org-entities-help 来查看所有的字符! 下标和上标 L...

阅读更多
函数中的语法

模式匹配(pattern matching) 这里的模式匹配有点像switch...case...下面的函数判断传入的参数是不是7 lucky :: (Integral a) => a -> String lucky 7 = "yes" lucky x = "no" 这个函数会从上而下判断,先看是不是7,如果是,则返回"yes",再看下一条规则, 这里的x表示任何变量(可以用任何名字表示)。 可以想到,可以使用这个办法来实现递归: fact :: (Integral a) => a -> a fact 0 =...

阅读更多
高阶函数

curried function 我还是直接翻译成“用咖啡煮的函数吧”。 有一个有趣的现象: Prelude> max 1 2 2 Prelude> (max 1) 2 2 我刚开始觉得这太不可思议了,max 1居然可以执行,而且它的返回值还拿2来当参数! 原来这个函数可以写成下面这两种形式: Prelude> :t max max :: Ord a => a -> a -> a Prelude> :t max max :: Ord a => a -> (a -> a) 第二种,如果给max传一个参数x,则它返回一个函数,这个函数...

阅读更多
introduction

what is haskell haskell是一种纯粹的函数式编程语言 没有副作用 一种懒惰的语言,只有当要显示结果的时候才执行函数 静态类型化,不用指定类型,编译器能自己决定 高雅,简洁,代码量少 由顶尖人才发明 how to program 2个著名的haskell编译器是GHC(glasgow haskell compiler)和Hugs 安装完ghc后,在终端打ghci,可以进入互动形式的编程环境,就像python和ielm [monkey@itlodge note]$ ghci GHCi, version 7.6.2: http://www.haskell.org/ghc/...

阅读更多
递归

一些基本的递归函数 在haskell中,没有循环,有的只是函数,要完成一些事情,只能使用递归来做,而且 完成得比较好。看下面的求最大值函数: -- function maxi, to get the maximum value of a list maxi :: (Ord a) => [a] -> a maxi [] = error "empty" maxi [only] = only maxi (first:rest) | first > maxRest = first | otherwise = maxRest where...

阅读更多
types and typeclasses

概述 haskell有类型推理机制,如果我们写一个数字,我们不用告诉编译器它是一个数字, 编译器能够推理出它是一个数字。 使用:t命令可以查看一个表达式的类型。 ghci> :t 'a' 'a' :: Char ghci> :t False False :: Bool ghci> :t "aaa" "aaa" :: [Char] ghci> :t ('a', "aaa") ('a', "aaa") :: (Char, [...

阅读更多
gtk, widget

看下面一个装载widget的程序: #include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //macros #define BORDER_WIDTH 10 //global variables GtkWidget *win; GtkWidget *btn; GtkWidget *top_box; GtkWidget *separator; GtkWidget *bottom_box; GtkWidget *label; GtkWidget...

阅读更多
gtk, introduction

简介 GTK(GIMP ToolKit),是用于构建GUI的库来的。取这个名字,是因为GTK是用于开发GIMP (GNU image manipulation program)的,现在也用来开发GNOME(GNU Network Object Model Environment),它建立在GDK(GIMP Drawing Kit)的基础上。 弹一个窗口的程序 代码 #include <gtk/gtk.h> int main(int argc, char *argv[]) { GtkWidget *win; gtk_init(&argc, &...

阅读更多
如何成为一个黑客

本文为"how to become a hacker"一书的笔记 什么是一个黑客 有一个社区,里面有共享的文化,有顶级的编程高手,有网络天才,他们发明了UNIX系统, 他们建立了互联网,如果你是其中的一员,如果你为社区做出了贡献,别人称你为黑客, 那么你就是一名黑客。 有两个词经常被人搞混,hacker和craker,即黑客和骇客。两者有本质区别: hackers build things, crackers break them. 黑客的态度 黑客解决问题并创造事物,他们信仰自由和志愿互助。 如果要成为黑客,一定要从骨子里有这种态度,如果仅仅是为了获得认同而假装这种态度...

阅读更多
kde introduction

常识 KDE可以安装在智能手机和平板(tablet)上,而且居然可以安装在windows和mac上。 菜单 文件 关闭当前标签或文件:CTRL + W 关闭程序:CTRL + Q (再也不用按ALT + F4了) 编辑 重做:CTRL + SHIFT + Z (再也不是CTRL + R) 替换:CTRL + R (R代表replace) 查找下一个:F3 查找上一个:SHIFT + F3 操作 滚动 原来在按鼠标滚轮时,按住shift,速度会加快 缩放 原来在KDE中,也可以按CRTL + + 和CTRL + -来控制放大和缩小,当然CTRL加滚轮也一样 查看文件 查看/...

阅读更多
项目管理与信息技术环境

系统观点 高层管理者和项目经理必须遵循系统哲学,使用系统分析的方法来满足解决问题的需要。 系统管理的三维模型:业务,组织,技术。 组织 项目经理应该在一个超越项目本身的更大的组织环境中看待这个项目。 组织的4个框架: 结构(部门的分配,部门的协调和控制) 人力资源(人员与组织的平衡) 政治(团体和个人的权力与领导地位) 标志(公司文化) 组织结构主要分为: 职能型(学校) ~/pictures/sn3.png 项目型(国防,建筑,工程,咨询) ~/pictures/sn4.png 矩阵型 ~/pictures/sn5.png 下表可清晰看出3种组织结构的区别: ~/pictur...

阅读更多
简介

项目 什么是项目 一个项目,就是为了创造一个独特的产品、服务或结果的临时性努力。 A project is a temporary endeavor undertaken to create a unique product, service or result. 而IT项目则是使用硬件、软件或网络来创造一件产品或服务而进行的临时性努力。 项目的属性 有唯一的目的 临时性的 使用逐步推进的方式开发 需要各个领域的资源 需要一个主要的客户和代言人(sponsor) 有不确定性 项目的三个约束 范围(scope) 时间(time) 成本(cost) 项目管理 什么是项目管理 项目管理就是在...

阅读更多
c陷井和缺陷

本文为"c traps and pitfalls"一书的笔记 词法陷井 看下面的代码: y = x/*p; /* p points to the divisor */ 本意是x除以p指向的变量,而事实上这样写/*会认为是注释的开头。 所以,双目运算符两边加空格是非常好的。 语法陷井 !=的优先级要比&之类的逻辑运算符高,所以不要有下面的写法 if (flags & FLAG != 0) +号等运算符优先级要比[]{#和}的高,所以不要有下面的写法 r = h << 4 + 1 运算符优先级的记忆方法 优先级最高的是那些不...

阅读更多
复习C/C++

本文为《C笔试面试宝典》一书的笔记 new, delete, malloc, free的关系 new和delete是C++的运算符,new调用构造函数,delete调用析构函数。 delete和delete[]的区别 delete只会调用一次析构函数,delete[]则会调用每个成员的析构函数。 写程序一测: #include <iostream> #include <string> class Computer { private: std::string name; public: Comput...

阅读更多
C语言实现的矩阵类

随着学习的深入,数学是必不可少的,最近复习到矩阵,于是用我最喜欢的C语言写 了一个矩阵类,使用面向对象的方法,只实现了简单的操作:新建,删除,加,减, 乘,求幂,转置等,以后会再增加。 matrix.h #ifndef _MATRIX_H_ #define _MATRIX_H_ #include <stdio.h> #include <stdlib.h> //matrix element's type typedef double matrix_t; typedef struct matrix Matrix; struct matrix { int...

阅读更多
开幕

本文为"Algorithms"一书的笔记 fibonacci 书上给出了另外一种我想不到的解法: #include <stdio.h> #define MAXN 100 int fib[MAXN]; int get_fib(int num); int main(int argc, char *argv[]) { printf("%d\n", get_fib(10)); return 0; } int get_fib(int num) { int i; fib[0] = 0; fib[1] ...

阅读更多
比较高效的整数求幂法

最近在看快速求fibonaci数列的方法,需要用到快速求幂法,于是参考了这篇文章 , 做下笔记。 最直观的方法 如果叫我求一个整数的n次幂,我要么用pow,要么写个循环直接相乘。 比如要求: 5 ^ 55 的结果,很明显,要进行54次乘法。要知道,在目前的计算机体系架构中,乘法的计算 是非常慢的。 效率高的求法 有的聪明人(不是我)就想到了减少乘法次数的方法: 5 ^ 2 = 5 * 5 5 ^ 4 = (5 ^ 2) * (5 ^ 2) 5 ^ 8 = (5 ^ 4) * (5 ^ 4) 5 ^ 16 = (5 ^ 8) * (5 ^ 8) 5 ^ 32 = (5 ^ 16) * (5 ^...

阅读更多
KMP算法-我的理解

动机 看了一本叫做《C/C++面试题》的电子书,里面提到找子字符串的算法,最好的是KMP, 于是开始了KMP之旅! 在网上看了好几篇中文文章,没一篇看得懂,最后找到了2篇英文文章,深有启发: searching-for-patterns-set-2-kmp-algorithm the-knuth-morris-pratt-algorithm-in-my-own-words 特别是第2篇,让我深刻理解了KMP中的预处理,而第1篇则让我学会了如何用高效的方法 实现预处理。 于是,我也来写一篇文章,用自己的理解来实现KMP算法。 在哪里优化? 如果要让我写一个程序来找到子串,唯一能想到的方法就是...

阅读更多
数字的算法

基本代数 加法 十进制有一个很傻逼但是很有趣的性质: 任意3个个位数相加的和最多是两位数 事实上,对于任意进制,都有这个性质。 另外一个很有用的性质: 对于一个基数为b的k位数,它能表示的最大数为$b^{k^ {-1}}$ 想要知道一个基数为b的数有多少位k,则: $ k = log_b(N + 1) $ 乘法和除法 这里出现了一种神奇的乘法算法,对于计算机来说效率非常高, 引用wikipedia 的例子: Decimal: Binary: 11 3 1011 11 5 6 101 110 2 12 10 1100 #w...

阅读更多
shell基础知识

本文整理自我多年前读Advanced Bash-Scripting Guide一书的笔记 特殊字符 # 在双引号和单引号里面的#不会被认为是注释开始,经\转义的#不会认为是注释开始。 echo "#这里不是注释" echo '#这里不是注释' echo \#这里不是注释 echo #这里不是注释 ; 和C语言不同,这里分号用于在同一行中分隔两条命令,这一点和pascal很相似 if [ -z $1 ]; then echo "-->must with paramether 'start' or 'st...

阅读更多
shell 编程!

引言 我非常欣赏这句话。 没有完美的编程语言。没有最好的语言,只有最合适或最不合适的语言。 --Herbert Mayer 写脚本 我之前也写过一点点的bash shell,完全是为了少打一些命令。但是我之前 写的代码很不规范,今天看了第一份代码,立刻发现了我应该注意的地方。 注释#后面要加一个空格,一行写不完的注释后面几行的要以#+开头。 # this is a comment,but it may be #+ too long 程序的结束要写一个exit 0,这个就像C语言中的return 0 引用变量,最好要加上双引号 引用命令的执行结果使用``(和波浪号同一个键的那个符号)...

阅读更多
伴随矩阵恒等式的证明

伴随矩阵最基本的恒等式为: $ A(A^*) = |A|E $ 怎么证明呢? 参考了这里 直接从定义出发来证明。 以一个 3x3 的具体行列式为例。 $ A = \begin{vmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \\ \end{vmatrix} $ 根据定义,A 的伴随矩阵 A^*为每个元素的代数余子数按列排组成的矩阵。 $ A^* = \begin{vmatrix} A_{11...

阅读更多
代数余子式异乘为0的证明

在行列式里面,代数余子式有个性质: 如果某行(列)元素分别乘以其他行(列)的代数余子式,则结果为 0. 怎么证明呢? 一直想不到方法,看了宋浩的视频,恍然大悟。 证明是这样的,以一个 3x3 的具体行列式为例。 $ A = \begin{vmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{vmatrix} $ 如果用第 3 行的元素分别乘以第一行的余子式,即 $ B = a_{31}A_{11} + a_{32}A_{12} + a_{33}A_{13} = 7A_{11} ...

阅读更多
一个重要权限的证明

这个权限是: $ \lim_{x \to 0}\frac{sinx}{x} = 1 $ 证明方法是用几何方法,这里学到了不少东西。 先看图: {{< figure src="/images/sinx_x_circle.png" width="50%" title="sinx/x circle" >}} 证明: 做一个半径为 1 的圆,x 为该扇形的弧度,所以弧长 $\widehat{AB} = x, BO = AO = 1 $, 则: $ sinx = \frac{BC}{BO} = BC $ 由于: $ sin...

阅读更多
常用不等式及证明

和差不等式 $ \vert a \pm b \vert \le \vert a \vert + \vert b \vert $ $ \vert \vert a \vert - \vert b \vert \vert \le \vert a - b \vert $ 这 2 个不等式,应该是显然的,不需要证明了。 均值定理 $ 若 a_1, a_2, ... a_n > 0, $ $ Q_n = qrt{\frac{a_1^2 + a_2^2 + ... + a_n^2}{n}} $ $ A_n = \frac{a_1 + a_2 + ... + a_n}{n} $ $...

阅读更多
一元二次方程求根公式推导

一元二次方程 $ax^2 + bx + c = 0$的求根公式为: $ x_{x1,x2} = \frac{-b \pm qrt{b^2 - 4ac}}{2a} $ 推导过程 根据经验,左边如果可以写在平方的形式,通过开方,就可以求得根,所以我们的目标是通过变换,得到左式为平方的形式。 因为 $ax^2 + bx + c = 0$ 将c移到右边,得: $ax^2 + bx = -c$ 两边都除以a,得: $x^2 + \frac{b}{a}x = -\frac{c}{a} $ 两边都加上$(\frac{b}{2a})^2$, 得: $x^2 + \frac{b}{a}x ...

阅读更多
1至n的平方和公式推导

高中学过这样一个公式: $ 1^2 + 2^2 + ... + n^2 = \frac{n(n + 1)(2n + 1)}{6} $ 当时说这个公式的证明超纲了,先记住。 现在来研究一下怎么证明。 要证明这个公式,先要证明立方差公式。 立方差公式 我们知道平方差公式是这样的: $ a^2 - b^2 = (a + b)(a - b) $ 这个公式已经滚瓜烂熟了,一眼也能看出来,不需要证明。 立方差公式是这样的: $ a^3 - b^3 = (a - b)(a^2 + ab + b^2) $ 怎么证明呢? 我们可以考虑,它应该跟 $ (a - b)^3 $ 有关,因为它分解之后会包含...

阅读更多
三角函数和差化积公式推导

一道函数单调性问题 遇到一道题: 判断 $y = cosx$在区间$(0, \pi)$上的单调性。 通过几何画图是很快看出来的,关键是怎么证明呢? 证明过程是这样的: 令$x_1,x_2 \in (0, \pi), x_1 < x_2$, 则$ cosx_2 - cosx_1 = -2sin\frac{x_2 + x_1}{2}sin\frac{x_2 - x_1}{2} $. 由于$x_1, x_2 \in (0, \pi)$, 所以$\frac{x_2 + x_1}{2} \in (0, \pi), \frac{x_2 - x_1}{2} \in (0, \pi)$, 所以$sin\...

阅读更多
实现一下SHA1算法

由于工作中经常会接触到数字签名,摘要算法等知识。现在准备实现一个最基础的摘要算法: SHA1。 算法的文档在RFC3174。这一份 standard 里面定义了很多规范,我们一个一个看。 输入内容长度限制和输出内容的长度 When a message of any length < 2^64 bits is input, the SHA-1 produces a 160-bit output called a message digest. 输入的内容转成二进制之后,长度必须小于 2^64 位。由于这是一个 Hash 算法,输出的长度是固定,SHA1 的输出长度是 160 位的二进制。...

阅读更多
初步学习JDK的Enum类源码

最近有空看了 Enum 类的源码,下面只挑重点部分记录一下。 抽象类 所有 enum 类型自动继承自 Enum 类,由于 java 的单继承特性,也就使得 enum 类型不能继承,个人觉得这是缺点之一,平时开发中会有一些公共的代码无法通过继承来共享。 核心成员为 name 和 ordinal private final String name; private final int ordinal; name 是定义 enum 时的名字,ordinal 是位置,从 0 开始 实现 Comparable 接口 Enum 可比较,实现的 compareTo 方法如下: public fina...

阅读更多
初步学习JDK的String类源码

最近有空看了部分 String 类的源码,下面只挑重点部分记录一下。 为什么要用 final 修饰类 第一个比较特别的就是,String 类是用 final 修饰的,表明这个类不可被继承。 public final class String 为什么要防止被继承呢?经过一番研究和思考之后,目前比较靠谱的解析是:String 类是设计成不可变的。假设可以被继承,我们就可以写一个子类继承 String,然后覆盖它的部分方法,使得不可变性遭到破坏。最后,我们把这个子类传给使用方,使用方预期是一个不可变的 String 类,实际得到的是一个可变的子类,这样就出问题了。 使用 char value[]存...

阅读更多
React入门-井字游戏实现与完善

前段时间换了家外企工作, 空闲时间比较多。 虽然我是做Java后端的,但是老外喜欢搞敏捷开发和全栈,所以也要写前端,既然是老外,那肯定是喜欢用React的,然而我之前从来没写过React,只能从基础一步一步来了。 井字游戏 井字游戏是React官方的入门实战教程的案例来的,在这里。 这个游戏的规则是这样的: 一共9个格子的棋盘, 共2种棋子,分别是X和O 每次,一个玩家将棋子下到一个格子上 如果有3个相同棋子在横/竖/对角线上相连,那就赢了,否则就为和局 最后的效果是这样的: {{< figure src="/images/tic_tac_toe_original.gif&...

阅读更多
阿里java开发者手册读书笔记

POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误 心得:这个之前我写的代码的确会下意识地就用isXXX,现在遵守这个规范,因为一些RPC框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛 出异常。 杜绝完全不规范的缩写,避免望文不知义 心得:反例举了2个例子,AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。好吧,我就是把抽象类写成AbsXXX的,现在遵守这个规范,写全。 Service/DAO 层方法命名规约 获取...

阅读更多
String permutations

There is an interview problem. Given a string without duplicate characters, return all permutations of the string. First Try The straightforward idea is using recursive algorithms. We enum all characters for the first position and concatate the permutations of the rest substring. However, the speed ...

阅读更多
Replace Joi with Class-validator in Typescript

引子 对每个接口的传入参数进行校验,是一个Web后端项目的必备功能,有一个npm包叫Joi可以很优雅的完成这个工作,比如这样子: const schema = { userId: Joi.string() }; const {error, value} = Joi.validate({ userId: 'a string' }, schema); 我们使用Typescript是希望得到明确的类型定义,减少出错的可能性。在一个后端项目中,给每个接口定义它的传入参数结构以及返回结果的结构,是一件很值得做的事情,因为这样给后续的维护带来极大的便利。比如这样子: ex...

阅读更多
Learning Bagging Algorithms

import random def max_value_recursive(weights, values, max_weight, i): if len(weights) == i: return 0 if max_weight - weights[i] <= 0: return 0 value_not_pick = max_value_recursive(weights, values, max_weight, i + 1) value_pick = max_value_recursive(weights, value...

阅读更多
Longest common Subsequence

求最长公共子序列的长度,是线性动态规划最基础的内容。现在我自己手写并理解两种实现算法,做此笔记。 暴力算法 思路是,双重循环遍历2个数组,当发现2个元素相等时,递归地去找各自数组后面的子序列的最长公共子序列的长度,再加1就是当前最长的公共子序列的长度,然后取最大值。 import random def lcs_recursive(arr1, arr2, left, right): if left >= len(arr1) or right >= len(arr2): return 0 max_len = 0 for i in ra...

阅读更多
Longest Increasing Subsequence

求最长递增子序列的长度也是动态规划里面的基础问题。记得当时大学的时候碰到这个问题,想破了脑袋也想不出来非暴力的解法,现在写起动态规划的算法还是比较得心应手的,证明这几年我的确是进步了。 下面重新复习这个问题,作此笔记。 暴力算法 思路是,遍历每个元素,往后面找到一个比它大的数,递归地调用,计算出来当前的最长递增子序列的长度,再取每个元素计算出来的长度取一个最大值。时间得杂度为$O(n!)$ import random def lis_recursive(arr, i): if i == len(arr) - 1: return 1 max_len = 0 ...

阅读更多
Different Implementation of Binary Tree Traversal

最近在做leetcode时,发现了另外一种二叉树遍历的方法,于是总结回之前掌握的遍历方法,做此笔记。 建树 首先定义一棵树,val为元素的值,left是左节点,right是右节点。 并做最基本的建树操作,传入一个数组,构造一棵二分查找树。 class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class BinaryTree: def __init__(self, arr): self....

阅读更多
Learning SubString Searching Algorithms

def substr_kmp(string, pattern): if len(string) == 0 or len(pattern) == 0: return -1 next_table = [-1 for i in range(0, len(pattern))] i = 0 j = -1 while i < len(pattern) - 1: if j == -1 or pattern[i] == pattern[j]: i += 1 j += 1 ...

阅读更多
Leftist tree's implementation and application

不小心看到一种数据结构,叫左偏堆,又叫左偏树,据说跟二叉堆一样,可以实现优先队列的功能,而且比二叉堆实现起来简单,于是研究了一下。 需求 优先队列的应用是非常广泛的,工作中还没遇到过这种需求,所以我现在制造一个需求,假设现在在开发一个项目管理系统,我们每天都要用的那种,每个任务都有优先级,我们肯定是先做优先级高的任务,再做优先级低的任务,由于插需求的事情经常发生,当一个需求插入时,我们要实现一个功能:优先级最高的排在看板的最顶部,当任务移走时,下一个优先级最高的排在最前面。 实现 看板的一列,我们可以看做是一个列表,每个元素,我给它定义成一个类Card,它有2个成员: title和priori...

阅读更多
Different Version of Quick Sort

最近在看《编程珠玑》,讲到快排的时候,发现除了我之前一直用的划分方法之外,还有一种划分方法,可以在大量元素相等的情况下保持较大的效率,查了一下,原来我以前一直写的划分方法叫做单向扫描法,现在这种方法叫做双向扫描法。于是,自己动手实现一下,涨知识。 因为后面要做性能比较,出于公平,都使用非递归方式来实现,用了python的deque来当作栈来使用。 下面这个是我之前很熟悉的单向扫描法的实现: import random from collections import deque def quick_sort1(arr): queue = deque([0, len(arr) - 1])...

阅读更多
Learning Select Algorithms

最近在看《编程珠玑》,有一道题我很感兴趣。 编写程序,在O(n)时间内从数组 x[0.. n-1]中找出第k个最小的元素。 我第一反应,就是利用快排的思想,不断地缩小查找空间,平均可以实现O(n)的时间复杂度,但是想了一下,最坏的情况下(倒序),需要$O(n^2)$的时间复杂度。难道还有更快的方法吗?去看了一下答案,发现答案就是我想到的这种方法。出于好奇,我就去网上搜了一下,原来这个问题很多人都研究过,并且有好几种方法,而我想到的这个方法,就是快排的作者发明的,叫做quick select,而这种找出第k个最小元素的算法,也叫select算法,利用这些高效的算法来找出中位数,将是初中高中学数学...

阅读更多
Learning Path Finding Algorithms

import numpy as np import matplotlib.pyplot as plt %matplotlib notebook N = 10 OBSTALE = '1' ROAD = '*' START = 'S' END = 'E' game_map = np.array([[ROAD] * 10] * 10) game_map[1:5, 1] = OBSTALE game_map[8:10, 1] = OBSTALE game_map[2:6, 3] = OBSTALE game_map[7:10, 3] =...

阅读更多
Git Cheat Sheet in Our Team

由于近期有团队成员对git不是很熟悉,加上团队对git操作没有规范,通过此文规范团队的git规范,同时让成员学会一些常用的git操作,提高工作效率,减少错误。 其实本人也是半桶水,git有很多技巧以及高级用法,我都没用上,只是记录一些工作中经常使用的技巧和个人推崇的规范。 Git流程 结合团队的情况,由于我们追求快速迭代,业务不是特别复杂,并且把任务拆分很细,所以基本每个人独立开发一个任务,开发完立即发布,没有太多任务之间的依赖,所以制定Git流程如下: 接到任务 --> 基于本地master分支新建任务分支 --> 开发 --> 在该分支上构建docker镜像部署到测试环境...

阅读更多
List Rotate Algorithms

最近在《编程珠玑》上看到一道很有趣的题目: 假设我们在开发一个编辑器,要实现一个功能,将下面代码的2个函数调换位置,该怎么做呢?如果空间复杂度要求$O(1)$,又应该怎么做呢? texts = [ 'def add(a, b):', ' return a + b', ' ', 'def sub(a, b):', ' retturn a - b', ' ' ] 其实这就是数组左旋转的问题,将数组的前3个元素移到数组的结尾。我最直接的想法,就是用另外...

阅读更多
Learning String Sorting Algorithm

场景 假设有一个手机号数组,要求对这个数组进行排序,怎么样排序最快呢? 一般我们会用快排来实现,现场写一个快排: from collections import deque def swap(strs, i, j): temp = strs[i] strs[i] = strs[j] strs[j] = temp def quick_sort(strs): queue = deque([0, len(strs) - 1]) while len(queue) > 0: start = queue.popleft() ...

阅读更多
Learning Strongly Connected Component Algorithms

引子 图论看到有向图的强连通分量部分,感觉非常有用,前面的无向图连通分量,还不知道应用在什么地方,现在来看看寻找强连通分量的算法有什么应用。 社交应用上,我们能记录每个人的聊天记录,最明显的是,我们能知道谁跟谁发过消息,比如: chats = [ ('Hank', 'Nick'), ('Nick', 'Hank'), ('Nick', 'Jamie'), ('Jamie', 'Swen'), ('Jamie',...

阅读更多
Learning Strongly Connected Component Algorithms

引子 图论看到有向图的强连通分量部分,感觉非常有用,前面的无向图连通分量,还不知道应用在什么地方,现在来看看寻找强连通分量的算法有什么应用。 社交应用上,我们能记录每个人的聊天记录,最明显的是,我们能知道谁跟谁发过消息,比如: chats = [ ('Hank', 'Nick'), ('Nick', 'Hank'), ('Nick', 'Jamie'), ('Jamie', 'Swen'), ('Jamie',...

阅读更多
Learning Topological Sort

引子 拓扑排序是以前学图论的时候学到的,但是当时太年轻,不了解这个算法的应用。现在终于知道,它在一些任务依赖方法应用广泛,比如编译系统,各个模块之间有依赖,形成一幅有向无环图,这个时候,使用拓扑排序,就可以找到编译的顺序,并且能发现哪些模块是可以并行编译的。 我希望这个算法能够应用在工作中,想起来我们系统中很多风控规则,其实每个规则就是一个任务,而目前只有几个任务是有依赖关系的,既然风控没有让我们定义依赖关系,我就自己定义一个关系吧: rules = [ ('userLoanLimit', 'platformLoanLimit'), ('...

阅读更多
Learning KD Tree

最近在学习KD树,研究了一天,终于是搞懂了!把自己实现的代码记录下来。 KNN的算法思想非常简单,但是暴力的计算距离,计算量非常大,而KD树这种数据结构的使用,可以将KNN的时间复杂度从$O(KN)$降低到$O(KlogN)$,这也是我非常感兴趣的一点。 学习的过程中,发现还有一种叫ball树,是为了解决KD树在高维时计算慢的问题,学无止境啊,这个就得后面慢慢研究了。 原理就不记录了,可以参考这个链接, 下面是我实现的代码: import numpy as np import timeit import matplotlib.pyplot as plt %matplotlib notebook...

阅读更多
Bloom Filter in action

这是一篇内部小型技术分享的文章。 需求 在金融业务系统里面,判断用户是否是黑名单,这种场景应该很常见。 假设我们系统里面有一百万个黑名单用户,用手机号表示,现在有一个人想借款,我们要判断他是否在黑名单中,怎么做? 一般方法 最直接的方法,是在数据库中查询,目前数据库上实现的索引,虽然可以做到$O(logn)$或者理论$O(1)$的时间复杂度,但毕竟是磁盘操作,跟内存操作不是一个数量级的。 于是,我们可以把黑名单中的手机号缓存到内存中,用一个数组储存起来,这种方法有两个问题,一是查找时间复杂度是$O(n)$,非常慢,二是占用大量内存。 查找速度上可以再优化,将数组变成Set,内部实现可以选择平衡...

阅读更多
Amazing Horner's rule

在看《算法导论》,思考题里面提到霍纳规则,出于好奇,查一下这个陌生的名词,结果发现了新大陆,原来在中国这个叫秦九韶算法,好像在中学的时候看过,现在肯定是忘光了,复习一下。 原来是一种计算一元多次函数的高效算法。比如给一个函数$f(x) = 1 + 2x + 3x^2 + 4x^3 + 5x^4$, 让我来写代码来计算,我一定是暴力计算,直接用求幂函数pow来算x,然后加起来。 现在就体现了算法的重要性,如果用上面的暴力算法,时间复杂度是$O(n^2)$,如果应用霍纳规则,时间复杂度居然可以达到$O(n)$! 霍纳法则的思想很简单,就是反过来想,从后面往前面计算,将已经计算的x的幂记录起来,以减...

阅读更多
Insert Sort Algorithm in Python

最近在看《算法导论》,前面讲到插入排序,我第一反应,忘了这个算法是怎么样的,果然还是不够熟悉,那就再练习几次。 这个算法还是非常重要的,很多语言的库里面,sort函数的实现,当个数小于某个较小的数时,都会使用插入排序,那是因为插入排序在元素有序的情况下,时间复杂度是$O(n)$, 而快排是$O(n^2)$,在元素较少的情况下,列表有序的概率比较大,比如1个元素是100%, 2个元素是50%, 3个元素是$\dfrac{1}{6}$,所以,在元素较少的情况下,使用插入排序来进行排序,速度是非常快的。 遇到这个算法,就想起打牌就行了。一开始我们左手是没有牌的,拿到一张牌,放到左手,第二张,从后面往...

阅读更多
How to get the square of N using Newton's method?

这是一篇内部小型技术分享的文章。 这次我们要来学习一个求近似平方根的快速方法: 牛顿法。 先上代码: def sqrt(n): ret = n while ret * ret > n: ret = (ret + n / ret) / 2 return ret print(sqrt(4)) print(sqrt(2)) 2.0 1.414213562373095 代码很简短,很神奇,为什么这样子可以求出来平方根呢?下面来推导一下。 设n的平方根为x, 则有 $x^2 = n$, 即$x^2 - n = 0$, 写成对x的函数的形式为$f(x) ...

阅读更多
How to check two segments cross

在《集体智慧编程》的随机优化章节,有提到判断两条线段是否相交的算法,我觉得非常神奇,研究了好久,终于搞明白了。 如何判断两条线段相交 两点连成一条线段,我们先在二维平面上研究一下。 假设有2个点a = (1, 1), b = (3, 3), 组成一条线段ab, 有另外2个点c = (1, 2), d = (2, 1),组成另外一条线段cd,如下图: %matplotlib notebook import matplotlib.pyplot as plt plt.text(1, 0.96, 'a') plt.text(2, 1.96, 'b') plt.te...

阅读更多
container-with-most-water

题目 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most wa...

阅读更多
Implement k-means algorithm myself

最近在看《集体智慧编程这本书》,再次学习k-means算法,虽然之前接触过很多,但是没有完全自己实现过,这次就试着根据算法思想,手写k-means算法。 这里使用的数据是书里面的博客数据,第一行是表头,第一列是博客名称,后面的列是每个单词出现的次数,大概长这样: Blog be not your Signal v. Noise - Medium 46 32 47 Eschaton 13 21 1 k-means算法的思想大概是这样子的: 先随机初始化k个点,称为中心点 对于数据集中的每条记录,计算它与每个中心点的距离,把它归到距离它最近的中心点的分组中 对于每个分组,通过均值计算中心点,得...

阅读更多
Play with the central limit theorem

最近在看《深入浅出统计学》,里面提到中心极限定理,意思是: 给定一个任意分布(不管是二项分布还是其他分布)的总体,每次从这个总体里面抽一个样本,样本空间是n,一共抽m组,把这m组样本的均值求出来,如果n比较大,那么这m组样本的均值近似服从正态分布。 现在生成10000个0~10的随机数,看一下中心极限定理是不是真的这么神奇。 import numpy as np randoms = np.random.randint(0, 10, 10000) print(randoms.mean()) print(np.var(randoms)) 4.5218 8.17272476 可以看到,均值为4...

阅读更多
N皇后问题

题目 The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'...

阅读更多
sqrtx 求整数平方根

题目 Implement int sqrt(int x). Compute and return the square root of x. x is guaranteed to be a non-negative integer. 我的思路 我能想到的只有暴力方法,从一个位置开始,一步一步加一,直到找到平方根。 代码 int mySqrt(int x) { long long times = 0; int y = x; while (y > 0) { y >>= 1; ++times; ...

阅读更多
Brent判圈算法学习

判断一个链接有没有环,很著名的算法是Floyd判圈算法,也叫龟兔算法。但是,原来还有一种算法,可以比Floyd更快一点,这种算法叫做Brent判圈算法。 算法思想 用2个指针rabbit和turtle从链表头出发。 rabbit先一步一步走,最多走2步,如果走到尽头,则无环,如果和turtle相遇,则有环,否则,本轮结束。 这个时候,把turtle放到rabbit当前位置,rabbit继续一步一步走,但是最多走4步,如果走到尽头,则无环,如果和turtle相遇,则有环,否则,本轮结束。 然后,把turtle放到rabbit当前位置,rabbit继续一步一步走,但是最多走8步,如果走到尽头,则...

阅读更多
find-all-duplicates-in-an-array

题目 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,8,2,3,1] Output: [2,3] 思路 想了好久,终于想出来了。首先,题...

阅读更多
battelships-in-a-board

题目 Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, empty slots are represented with '.'s. You may assume the following rules: You receive a valid board, made of only battleships or empty slots. Battleships can only be placed horizon...

阅读更多
array-partition-i

题目 Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible. Note: n is a positive integer, which is in the range of [1, 10000]. All the integers in th...

阅读更多
merge-two-binary-trees 合并二叉树

题目 Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the me...

阅读更多
maxiumn-subarray 和最大的子数组

题目 Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [-2, 1, -3, 4, -1, 2, 1, -5, 4], the contiguous subarray [4, -1, 2, 1] has the largest sum = 6. 思路一 首先,可以直接两重循环,找到所有的子数组,然后计算出来和最大的那个,时间复杂度为O(n),空间复杂度为O(1)。代码如下...

阅读更多
股票基础知识

summary : 涨速 单位时间内的涨幅,涨速越大,主力资金的实力就越大 特大单,大单,中单,小单 根据买的股数划分,买的股数占总股数的比例很大的,就是大单。 大单净买入 大单净买入 = 大单买入 - 大单卖出 流通盘与非流通盘 一家公司要上市,划分了两类股,一部分可以在股票市场上买卖,称为流通股,剩下的称为非流通股。 流通股:A股等市场上可自由买卖的股票 非流通股:国家股,法人股(境内发起人法人股,境外法人股,募集法人股),内部职工股,外资股,转配股,自然人股,优先股等 大单净量 大单净量 = 大单净买入 / 流通盘总股数 现手,总手,换手 最近一笔成交量叫现手,从开盘到即时的成交量...

阅读更多
空集

summary : 如果你是一个数集 那么我就是一个空集 因为 只要你愿意 我会把所有元素都给你 我永远包含我 我永远属于你 虽然 我们之间没有交集 但是 只要我们在一起 你就是我的全集...

阅读更多
我的爷爷

出生 我爷爷是地主的儿子。 在他年轻的时候,生活应该还是可以的。太爷爷有三个儿子,一个女儿,我爷爷排行 老三。据说,他们三兄弟在镇上有一个商铺。不是什么富贵的家庭,但是肯定不会比 建国之后差。"斗地主"的行动就在那个时候开始了,家里哪个地方藏了多少金子全部 都被逼着挖出来了,不过据说太爷爷没被逼死,已经算是幸运的了。田地充公,人民 公社化运动,开始了爷爷悲惨的下半辈子。 婚姻 爷爷娶过两个老婆,可惜两个都在很年轻的时候去世了。 第一个老婆,我不了解,据说娶了没多久就因病去世了。为了传宗接代,爷爷又娶了 第二个老婆,也就是我的奶奶。奶奶一共生了三个女儿和两个儿子,我爸爸是第一...

阅读更多
奋斗

summary : 这是一场接力赛 我却当成了百米跑 我奋斗一生的终点 也许是某些人的起点 跑好我这一棒就行了吗 不 奋斗是我一生的信仰...

阅读更多
有关SharedPreferences

summary : 纯粹记录,下次忘记了来查。 位置: import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; 取: SharedPreferences sp = mContext .getSharedPreferences("user", mContext.MODE_PRIVATE); String auth = sp.getString("auth", null); "user"是...

阅读更多
Activity生命周期

summary : 启动程序的时候,调用的是: onCreate --> onStart --> onResume 当按下Home键的时候,调用的是: onStop 当再启动程序的时候,调用的是: onRestart --> onStart --> onResume 当按下返回键的时候,调用的是: onStop --> onDestroy 当再启动程序的时候,调用的是: onCreate --> onStart --> onResume...

阅读更多
JAVA笔记

summary : 内置类型(int之类)有对应的引用类型,集合类型里面的元素的类型,不能用内置类型, 而要用对应的引用类型。ArrayList<int>是不对的,要写成ArrayList<Integer> 创建一个Integer对象,不要用 new Integer(10),而要用Integer.valueOf(10), 前者会不断创建新对象,而后者对于同一个整数只会创建一个对象,因为后者是以静态工厂 的方式创建的。同理,其他的类型Boolean, Float也一样。 获取enum元素的整数值,方法是使用ordinal()。如: enum Name = {H...

阅读更多
Android图片资源的放置

summary : res目录下有好几个目录: drawable:这里放的都是xml文件,不要放图片文件,基本都是放selector的 drawable-nodpi:放和分辨率无关的图片,如9-patch图片 drawable-ldpi:36 * 36的图片,官方建议删掉这个目录,因为大部分手机分辨率大于这个 drawable-mdpi:48 * 48 drawable-hdpi:72 * 72 drawable-xhdpi:96 * 96 drawable-xxhdpi:144 * 144,新出的,`见这个回答 <http://stackoverflow.com/question...

阅读更多
我会弹的曲子

summary : 黑夜 给了我黑色的眼睛 我却用它 寻找光明 曲子名 作者 学会日期 小星星 莫扎特 2014.12.17 Tears Daydream 2014.12.17 小毛驴 佚名 ...

阅读更多
一些奇技淫巧

最近在看 Hacker's delight ,把一些觉得有用的小技巧记一下来。 /******/ /******/ /******/ /******/ /******/ /******/ 把二进制数x的最右边一位1变成0: x = x & (x - 1) 其中的一个应用是,判断一个正整数是不是2的n次方或者0。 #include <stdio.h> int main() { int i = 0; for (i = 0; i < 1000; ++i) { if ((i & (i - 1)) == 0) { print...

阅读更多
我的外公

我7岁那年,到了上学的年龄。本来是应该和村里的孩子一样去村外的小学上学的,但是 从家里到学校要经过一条大路,路上经常有汽车飞驰而过,由于我是家里唯一的男孩, 为了延续香火,防止我早早夭折,家里人决定我把送到外婆家那边的小学读书。 我就是在这一年见到我的外公的。 外公是一个真真正正的旧社会农民,他每天都在种田和种地中度过。太阳晒干了他的头发, 也烤黑了他的身体。每当干活累了,他都会坐下来,拿起他的大烟筒,掏出劣质烟丝和点 火机,咕噜咕噜地抽起烟来。外公的脸有两个很大很大的"酒窝",估计是两边的牙齿掉了 的缘故。每次抽起烟来,脸的两边都会缩起来,然后喷出来长长的烟雾。在我看来,...

阅读更多
备忘录

summary : 写个小工具查询android中某个类的全称 看海贼王的android应用还没开发完 《经济学原理》还没看完 不要忘记,方向:数学,线性代数,统计学,概率,离散数学,数据结构,算法,机器学习,数据挖掘,数据仓库,android,ios, os x, 金融,经济,诗,钢琴...

阅读更多
"Algorithms"笔记 分治

summary : 乘法 对于复数的乘法,我们是这样算的: (a + bi)(c + di) = ac - bd + (bc + ad)i 但是,据说伟大的数学家高斯注意到的一个现象: (bc + ad) = (a + b)(c + d) - ac - bd 这样,原来要进行ac, bd, bc, ad四次乘法,现在就只需要进行(a + b)(c + d), ac, bd 三次乘法,虽然多了几次加法,但是对于计算机来说,乘法计算远比加法慢,在数据量很大的情况 下,这个小技巧将会使算法性能得到极大的提升。...

阅读更多
中秋有感

summary : 夜 多云 微风 吃饱饭 散步中 幽幽中秋 古月当空 三条光棍 何去何从 公园名荔香 树挂红灯笼 熊孩满地跑 其乐也融融 月下犹有严慈在 为子一世受牢笼 苍天 何时天下共月圆 大道 何日宇宙趋大同...

阅读更多
穷人不应该生育子女

玩耍上学工作结婚生育子女,有人说这是正常人必须做的事情。但是,作为一个人,谁规定我必须要走这样的路?走这样的路,真的幸福吗? 为了使每个人享受最大的幸福,从而使整个社会达到最大的幸福,穷人不应该生育子女。 这里说的穷人,不单指经济上贫穷的人,而是指综合上贫穷的人。 首先,必须认识到,这个社会总是有一半的人是穷人,一半的人是富人。《道德经》说,"天下皆知美之为美,斯恶已;皆知善之为善,斯不善已"。所以,这个世界上会存在富人,是因为存在穷人。现在的穷人跟几十年前的穷人相比,富裕了,但是跟现在的富人相比,还是贫穷。无论社会生产力提高到什么程度,无论社会发展到什么阶段,在某一时刻,...

阅读更多
铺毯翁

summary : 发如雪 身似弓 年与家父同 胸前领带蓝 脚下地毯红 双膝跪地灰似雪 两手压毯尘随风 老翁铺毯我踩踏,人伦何在? 此时此景不心酸,天理难容!...

阅读更多
一些有哲理的话

当世上所有人都把欲望当理想,把世故当成熟,把麻木当深沉,把怯懦当稳健,把油滑当智慧,那只能说这个社会的底线已被击穿,所以你们没有资格说我的勇敢是莽撞,执着是偏激,求真是无知,激情是幼稚。当那些兜售社会经验的流氓朝我的梦想投来轻蔑一笑的时候,我会毫不犹豫的还你一句,傻逼! 这句话据说是 白岩松 说的。社会现状就是这样,每一点都深有体会。 人什么时候才会死?被子弹贯穿心脏的时候?不对!得了不治之症的时候?不对!喝下毒蘑菇汤的时候?不对!是被人遗忘的时候! 这是 海贼王 里面乔巴的精神导师庸医西尔尔克临死前说的。看到这里的时候我被深深地感动了, 一个大男人像个小孩一样哭了。又想起了那句话, 有的人...

阅读更多
本科毕业有感

夏日炎 万里晴 前路当光明 珠江东去入南海 远航南下至鹏城 不忍回首,中大软院五二零 有缘再见,同学朋友大精英 弹指间 小男婴 二十又三龄 两地相遥望眼穿 三生以报养育情 岳飞挥鞭,立流芳百世功 远航扬帆,留千秋万代名...

阅读更多
图书馆美女

summary : 大眼睛 黑眼镜 花容如玉净 低头凝神在思考 眉挑眼眨似传情 眼睁心跳,偷偷看以解馋 无可奈何,此离去再无影...

阅读更多
我的童年

我把七岁以前归为童年,因为七岁之前的记忆很模糊,而我是在七岁的时候上学的。 用一句话评价那时的我------乖。记得有一次,夏季插秧,全家人出动,因为背着我不方便,刚好稻田旁边有一个小山丘,妈妈就把我放在那里,再用一个箩筐盖住,叫我好好呆在那里,等她回来。妈妈回来的时候,发现我乖乖地坐在那里,没有哭,没有叫,也没有乱跑,一旁的邻居都夸我乖。真的,人一生下来就有极大的不同,我完全不知道我为什么会那么乖,这么多年以来好像也还没见过比我更乖的小孩了。这应该是我能记住的最久远的事情了,我也不知道为什么就记住了。 玩具,可以说没有。现在看见农村小孩都在玩的小汽车,小卡车什么,一点都勾不起我童年的回忆。不...

阅读更多
叫外卖

summary : 天昏昏 云沉沉 一场暴雨将来临 正是晚饭点 大雨倾盆淋 抬头看天象 不到今夜不会停 低头看内环 天地之间水茫茫 只见一怪人 骑着一电车 载着一小袋 撑着一大伞 停在一路口 掏出一手机 撑着那把伞 镀在那电车 放好那手机 望着那路口 忽见一学生 戴着一眼镜 套着一短裤 拖着一双鞋 倚着一小伞 夹着一张钱 提着那小袋 交给那学生 拉着那小袋 推开那张钱 撑着那小伞 踏着那双鞋 扭着那短裤 消失在那路口 攥着那张钱 倚着那把伞 骑上那电车 消失在那路口 下雨天 你在那边 我却在这边 你不愿冒雨吃饭 我岂愿冒雨送饭...

阅读更多
二叉树的前序中序后序遍历非递归版本

summary : 面试中经常会让你写出三种遍历中的一种的非递归版本,通常是中序遍历和后序遍历,前序 遍历很少,因为前序遍历毕竟比较简单。 以我的智商,没有做过的话,只能想出来前序遍历的非递归版本,而中序遍历和后序遍历则 是绞尽脑汁都想不出来。最终参考了别人的做法,才理解并写出来了,算是记忆,估计再过 一段时间我又忘了。不过到时可以翻开我的这篇文章看看。 前序遍历 这个是最简单的。用一个栈存储节点,先输出栈顶元素的值,再把左右孩子的节点入栈(如 果有的话)。由于在遍历的时候是先遍历左子树再遍历右子树,那么反过来,在入栈的时候, 就先把右孩子入栈,再把左孩子入栈。 中序遍历 有难度。得先从...

阅读更多
面试题:最大子段和

summary : 面了两家公司,都是这个题,都不会做。不管以后还去不去面试,我都 一定 要把这 货给解决! 学了四年计算机,四年了,始终无法理解动态规划的精妙,能看懂,但是叫我想,我想不 出来。贪心思想,都能说,但是真正要运用,却不会。有的时候,智商问题就是无解。 假定给一个序列为:-10 1 2 3 4 -5 -23 3 7 -21。 开始分析。不管是用暴力方法还是用动态规划的方法,都必须要用一个数存放目前最大的 子段和,就用sum来记录吧。每得到一个临时的子段和,都要和这个最大的子段和比较, 如果临时的子段和较大,则更新,这个临时的子段和就叫temp_sum吧。有的时候,可能 要求...

阅读更多
面试中常考的现场手写题

二分查找 ::: {.code-include lexer="cpp"} ./binary-search.cpp ::: 有两个地方需要说明一下: 写这种程序,函数入口处必须断言,以保证程序的健壮性。 原来的 (low + high) / 2 写成 low + ((high - low) >> 1) 可以防止越界 以及提高效率。 快排 如果没啥要求,就写递归版的。 ::: {.code-include lexer="cpp"} ./qsort_r.cpp ::: 如果要写非递归版的,就用栈记录要排列的子序列的两个边界值。 ::: {.co...

阅读更多
在栈中实现min函数

在《剑指Offer》一书看到的题目。要求push, pop, min的时间复杂度都为O(1) 一开始我能想到的方法是,用一个指针指向当前栈中最小的元素,当有新元素进来时, 和当前最小元素比较,如果较小则更新指针,否则不做更改。但是当元素出栈时,就出现 问题了,如果出栈的是最小的那个元素,那我这个指针应该指向哪里呢? 再想,如果我用2个指针,一个指向次小元素,一个指向最小元素,会怎样呢?其实也不行, 这样是换汤不换药,当最小元素出栈时,次小元素也不知道指向哪里? 没办法,我记录所有元素的顺序就行了。这样的话,空间复杂度会翻倍,但是这是让3个 函数时间复杂度都为O(1)以空间换时间的办法。 实际上...

阅读更多
sicily 1203 The Cubic End

summary : 好不容易才想要刷道题,居然碰上了这么一道蛋疼的题,刚开始没看懂题(英语不好), 去查了单词才看懂了,然后想了半天没想出来,还是去看人家的解题报告才有了一些 灵感,水到爆了,我靠! 解题思路 题目意思是,输入一个数a的字符串,而且最后一个数必然是{1, 3, 7, 9}中的一个, 求一个位数不超过数a的数b,使得b^3的尾数是a。^ 显然,要得到一个数的最后一位,模10,同理,要得到最后2位,模20,..., 我居然还去搜了一下怎么得到一个数的尾数,结果找到了一篇五年级奥数的培训文章 (这不是赤裸裸地鄙视吗???)。 于是,我们可以从个位开始匹配,刚开始就是{1, 3,...

阅读更多
sicily 1509 Rails 解题总结

summary : 这题很明显,可以用2个栈来模拟,车进去是一个栈s,然后相当于有一个让道(可以看作 一个栈ss),储存先不出去的车厢。读取输入的车的顺序,放进数组里面,然后s先初始化 一个完整的栈n......2,1。对于输出的车的顺序的每一个元素,先检查的栈顶元素是否与它相 同,再检查ss的栈顶元素是否与它相同,如果都不相同,则s的栈顶元素出栈,继续找下一 元素,如果都找不到,则该顺序不可能产生。 代码: #include <iostream> #include <stack> using namespace std; const int N = 1001...

阅读更多
sicily 1198 Substring 解题总结

summary : 一看题目,总觉得直接sort就可以A了,但是交上去就是WA,无奈之下,只好google一下 偷看一下人家的分析。。。。。。。果然是有特殊情况!比如 dc dcc,直接sort,得到 的是dcdcc,而正确答案是dccdc,于是要自己写比较函数了!! 代码: #include <iostream> #include <string> using namespace std; bool cmp(string s1,string s2) { int i,j; for(i = j = 0; i < s1.size() &...

阅读更多
sicily 1070 Hansel and Grethel 解题报告

summary : 好久没刷题了,就去水题集里面挑了道水题做,居然绞尽脑汁想不出来,后来还是百度了一下, 发现网上有关这道题的博客一篇都没有,于是,google,终于找到了一篇!看注释: 求两直线的交点,交点必存在 。 我真的是太水了,可能天生就是这么笨,这样都想不到。于是不看他的代码,自己研究了一下, 结果............还是不会!无奈之下,看人家的代码吧......看了代码,很短,自卑了一下, 再看程序的核心,完全不懂!我差点羞愧而死......又研究了这份代码许久,终于是放弃了。 于是加了博主的QQ,博主人真的好,特地加了详细的注释,一看注释的内容就有种被鄙视的感觉。 我...

阅读更多
sicily 1152. 简单的马周游问题

summary : 我本来是想找用来练习栈的题的,看到了这个题,一想,这个和八皇后问题有点类似, 可以用回溯解决,便开始了,纠结了2天,发现输不出答案来的,找了1天,终于找出了bug, 当看到黑色的屏幕上出现一行白色的一行数字时,我内牛满面............但是,ctrl+c,ctrl+v, 返回一了一个红红的WA,我检查了一下,发现第一人测试数据完了之后,栈没有清空, 还好C++允许在中间声明变量,我把stack对象放到中间,就解决问题了,然后还发现, 第一个测试数据完了之后,全都标志成了1了,我又把数组全部标志成了0,这时, 发现输入2时,没有输出的,我以为进入了循环,又在调试...

阅读更多
sicily 1318 magic square 解题总结

summary : 闲得慌,便逃课出来,突然有刷题的冲动,于是开始了刷水题之旅。很快一道水题就A了, 然后碰到了1318这道。 题目大意: 输入整数N,(n >= 3 && n <= 15),构造魔方阵,使每行,每列及对角线的数字的和都相等, 然后输出这个和,并且输出这个矩阵。 分析: 根据提示:Imagine that the square is rounded. That is, the last row is connected with the first row and the last column is connected with the f...

阅读更多
sicily 1087 a funny game 解题总结

summary : 题目大意: N个硬币围成一圈,两个人来博弈,每次只能拿一至两个(相邻),Alice先拿, 最后一个拿的赢,写程序,给定N,判断是谁赢。 分析: 这是一道非常有趣的题,对于像我这样的初学者来说,题目的分析可能要费很大功夫, 但是一旦分析出来,就可以几行代码解决掉。 基本知识:给定N个硬币,排成一列,两个人取,每次只能拿一至两个,则A只需要将这 N个硬币从中间取出一或两个硬币,分成数目相等的两部分,然后B在一边拿多少个,A就 在另一边拿多少个,最终,A必定是最后一个拿的,所以A必定会赢! 延伸到此题:围成一圈的硬币,第一个取的人必定会把圆圈断开成一列,然后,结果被第 二...

阅读更多
面试题:合并升序排序的链表并去重

summary : 这是我去人人面试的时候遇到的题,当时我写出来健壮性不好,立马就被刷了。 题目 给出两个单链表,升序排序好了,要求合并两个链表,合并之后还是升序排序,而且去重。 链表的节点结构如下: struct Node { : int value; struct Node \*next; }; 分析 没啥好分析,合并加去重,关键是要注意很多特殊情况,要写多一些测试用例。这里,我 用的是递归的方式实现,每次取得两个链表比较之后的头节点,并放到合并之后的链表的 后面。 我的代码 ::: {.code-include lexer="cpp"} ./merge...

阅读更多
面试题:打印1至最大的N位数

summary : 题目 输入数字n,打印从1到最大的n位十进制数。如输入3,则打印1, 2, 3 ... 999。 分析 考虑特殊情况,n是否可以是负数或0。问面试官,n是否可以很大?如果n可以是很大,则 不能用int, long long来存,这个时候变成了高精度数据的问题,应该用字符串。而从 1到最大的N位数,其实就是这么多位数字的从0到9的全排列,于是可以递归地打印出来。 代码 ::: {.code-include lexer="cpp"} ./print_one_to_max_n_digit_number.cpp :::...

阅读更多
面试题:找出一个整数的二进制中1的个数

summary : 很经典的一道题,而且是很多位运算的题目的鼻祖,掌握它,很多问题的变种就可以解决 了。 题目 实现一个函数,输入一个整数,返回这个整数的二进制表示中1的个数。 分析 对于正数和0,很简单,先和0x1进行与运算,如果结果是1,则最低位是1。然后不断右移, 进行相同的判断,直到这个数变成0为止。 但是对于负数,就不能像上面那样做了,因为右移的话,左边会补1,则无法判断什么时候 结束了。这样有两种方法: 对于负数,规定右移31次就结束。 对于负数,先用0x1和这个数进行与运算,然后把0x1左移一位,变成了0x2,再进行 与运算,直到变成了0。这样也是移动了31次。 更好的...

阅读更多
面试题:找出旋转数组中的最小元素

summary : 在《剑指Offer》里面看到的一道题,非常有趣。 题目 把数组的开头一部分元素放到数组的末尾得到的新数组称为原数组的旋转。现在输入一个 递增排序的数组的旋转,如{3, 4, 5, 1, 2},找到这个数组的最小值(这里是1)。 分析 不可能直接遍历一次找到最小值。 本人比较笨,想不出来办法,看了书上的解析才知道,可以用二分查找的思想。当时觉得 太神了。方法是这样的:用left记录整个数组的第一个元素的下标,right记录最后一个 元素的下标,求两个下标的中间下标mid,如果mid指向的元素比left指向的要大,则说明 mid所在的范围为原数组递增的部分,这个时候把le...

阅读更多
面试题:重建二叉树

summary : 这是一个很老很老的题,我做它,就是为了练习,练到能闭着眼睛在纸上写出来。 题目 输入某二叉树的前序遍历和中序遍历的结果,重新建立这棵二叉树,输出它的后序遍历。 假设不含重复数字,类型为int。 分析 根据前序遍历和中序遍历求后序遍历是经典的二叉树问题了,不管是在选择题中还是在 写代码的题中,都会碰到。首先,要人脑会做,而且要有方法做,不是试出来的。主要 的思想是递归。比如前序遍历为1, 2, 4, 7, 3, 5, 6, 8,中序遍历为4, 7, 2, 1, 5, 3, 8, 6,则1肯定为根节点,然后从中序遍历中找到1,则1的左边的数字为左 子树,右边的为右子树。然...

阅读更多
面试题:查找有序的二维数组中的元素

summary : 《剑指Offer》里面看到的一道题,很有意思。 题目 给定一个二维数组,每一行按照从左到右递增排好序了,每一列按照从上到下递增排好序 了,写一个函数,输入这个二维数组和一个整数,判断数组中是否含有这个整数。 分析 抽象问题变具体。考虑下面的二维数组: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 要查找某个整数,关键是"夹逼",不断缩小范围,因为是有序的。从哪里开始呢?首先, 左上角和右下角是肯定不行,因为这两个地方不能"夹逼"。以左上角为例,往右边是变 大,往下边也是变大,当要查找的整数比左...

阅读更多
经典面试题:实现atoi函数

summary : 这是千年老题,看起来简单,要考虑的问题非常多。 题目 写一个函数atoi,把字符串转化成整数。 分析 转成整数不难,从头遍历,比如字符串1234,求整数的过程为: result = (((0 * 10 + 1) * 10 + 2) * 10 + 3) * 10 + 4 关键是要考虑特殊情况。 * 传入的字符串头指针为空 * 传入的字符串为空 * 传入的字符串有非数字字符 * 负数 * 溢出 目前,我的处理是,除了负数之外的特殊情况都打印错误信息,异常退出。负数则先按正数 处理,返回的时候加上符号。 代码 ::: {.code-include lexer="c...

阅读更多
面试题:将一个字符串中的单词逆序

summary : 题目 给出一个字符串,单词以空格隔开,写一个函数,传进这个字符串的指针,修改这个 字符串,使得单词的顺序相反,比如"I am a student"变成"student a am I"。要求不能 开辟缓冲区,不能用库函数,不能用 std::string 。 解法 这是千年的老题了,我之前去腾讯面试的时候第一个问题就是这个,结果我不会做,直接被 淘汰了。方法是先把整个字符串倒序,再按单词倒序,这样,求字符串长度是O(n),将整个 字符串倒序是O(0.5n),按单词倒序是O(1.5n),一共O(3n),即为O(n)的时间复杂度。 说起...

阅读更多
Sicily 1498 Elementary Additions 我的解法

summary : 题意 重新定义了数的表示, 0 => {} 1 => {{}} 2 => {{},{{}}} 3 => {{},{{}},{{},{{}}}} 给出右边的集合形式的表示,计算两个数相加的结果,结果也以集合的形式表示。 分析 找规律,0是空集,1是集合里面包含了整个0的集合的表示,接着2,左边是1的集合里面 的东西,右边是1整个集合的表示,中间用逗号分开,对于3,左边是2的集合里面的东西, 右边是2整个集合的表示,中间用逗号分开。 利用上面的规律,给定任意的整数,就可以通过递归来输出集合的形式了。 怎么根据集合的形式得到整数呢? 看逗号!0和...

阅读更多
笔试题:找出数组中出现次数超过数组大小一半的整数

summary : 今天去参加人人的笔试,好多人,好多大神,题目也很难。倒数第二题是这样的。 题目 现在有一个长度为n的数组a,里面有超过一半的整数为一个定值,在不用排序,不开辟新 数组的情况下,用最快的算法找出来这个数, int find(int *a, int n) 。 分析 唉,纠结了好久没做出来,果然算法不行的人是要被虐的,没办法,只能多练了。搜了一 下,原来这题也是千年的老题,看了 这里 的分析,才暗暗觉得人家的算法的高明。 只需要两个变量,一个记录当前值,一个是计数器。初始的时候,当前值为第一个元素, 计数器为1。然后遍历整个数组,遇到和当前值不同的数,计数器减1,相同则加1...

阅读更多
Sicily 1438 Shopaholic 我的解法

summary : 题意 购物狂去买东西,买3件付两件的钱,最便宜的那件不用付。比如买了3个item,分别为 200元,150元,400元,则只需付600元,折扣为150元。如果买超过3件,一起付钱的话, 也只是不用付最便宜那件。这样当然不划算,于是可以多次付钱,每次选3件。不够3件就没 办法了,没有折扣。要求写程序求最大折扣是多少。 我的解法 购物狂是贪心的,这里就是贪心的思想。拿价格最高的3件先去付钱,再从剩下的里面拿 价格最高的3件。最后如果剩下不够3件的,则只能直接付钱了。非常简单,直接排序, 然后根据买的商品的件数,如果刚好是3的倍数,则把下标为3的倍数减一的价钱相加。如果 余...

阅读更多
程序员面试宝典读书笔记

C/C++程序设计 浮点数的存储 有下面的代码: #include <stdio.h> int main(int argc, char *argv[]) { int a; float *b = (float *)&a; *b = 13.0f; printf("%d\n", a); printf("%#x\n", a); return 0; } 最后的输出会是多少呢? 答案是: 1095761920 0x41500000 涉及到IEEE754浮点数的存储方式。 这是计...

阅读更多
程序员面试宝典读书笔记

C/C++程序设计 浮点数的存储 有下面的代码: #include <stdio.h> int main(int argc, char *argv[]) { int a; float *b = (float *)&a; *b = 13.0f; printf("%d\n", a); printf("%#x\n", a); return 0; } 最后的输出会是多少呢? 答案是: 1095761920 0x41500000 涉及到IEEE754浮点数的存储方式。 这是计...

阅读更多
一个带颜色输出的echo

动机 为了找到工作,最近需要多写shell了,有时候我很想输出信息的时候有颜色,比如 成功的信息用绿色,错误的信息用红色,去查了一下echo,发现写起来一大堆麻烦, 甚至是硬编码,没办法,参考自这篇文章 ,自己写了一个给自己用。 基础知识积累 通过echo的man手册及网友的帮助,发现,echo用-e来开启转义,设置颜色的格式为: \e[background;foreground;高亮m字符串 默认的为: \e[0m 背景色的数字: number color 0 transparent 40 black 41 red 42 ...

阅读更多
配置测试与兼容性测试

本文为"software testing"一书的读书笔记 配置测试 其实是有关硬件的测试。需要测试的内容: PC类型(戴尔的?联想的?苹果的?) PC部件(不同的主板,CPU,声卡,显卡,网卡等) 外围设备(鼠标,键盘,打印机,摄像头等) 接口(USB,PCI,PS/2等) 存储量大小(比如显卡有显存大小,内存条有内存大小) 设备驱动(该设备的驱动程序有没有?) 在进行配置测试时,可能需要买(或者借)很多种品牌的硬件来测试,比如可能需要 几百种声卡和显卡,要测试完所有的种类是不可能的,这个时候就需要等价划分了, 或者只测试主流的设备。 要了解这些PC的主流硬件,需要去搜...

阅读更多
检查代码

本文为"software testing"一书的读书笔记 静态白盒测试:检查设计和代码 formal review 这个过程有4个方面要做: 找到问题(错误的地方或者漏掉的地方) 遵守规则(遵守架构规则和代码规范) 要有所准备(不打无准备之战) 写报告(有助于后期维护) 完成这个过程有助于: 团队成员之间的交流 项目的质量 增进团队成员之间的友谊(camaraderie) 可能会找到一些难题的解决方案 peer review 这是一种非正式的过程,通过是一个程序员设计和写的代码被其它几个程序员 和测试师来检查,小团队里面的成员会互相检查代码。 walkthrough...

阅读更多
带上X光眼镜测试软件

本文为"software testing"一书的读书笔记 动态白盒测试 显然,动态即要运行,白盒即要看到代码。dynamic white-box testing, 也叫structural testing. 这听起来和调试很相似,但是它和调试还是有很大区别的。 动态白盒测试是要找到bug,而调试是要fix the bug 解决一个问题的过程就包含了动态白盒测试和调试,因此两者之间有一部分重合, 分块测试 单元测试(unit testing):把整个软件分成很多的小模块,对每个小模块的测试 集成测试(integration testing):把一些模块集成在一起,对一组...

阅读更多
tcpl读书笔记:函数与程序结构化

本文为the c programming language一书的笔记 exercise 4-2 扩展atof函数,支持科学计数法。下面是我写的代码,未完全测试正确。 #include <stdio.h> #include <string.h> #include <math.h> int isBlank(char c) { return c == ' ' || c == '\n' || c == '\t'; } int isDigit(char c) { r...

阅读更多
tcpl读书笔记:简介与基础

本文为the c programming language一书的笔记 铭记c语言之父 不要忘记他们的名字,也不要写错他们的名字,他们是: Brian W. Kernighan Dennis M. Ritchie 简介 历史 c语言受BCPL语言和B语言的影响 BCPL语言由Martin Richards发明 B语言由Ken Thompson发明,他和Dennis Ritchie 并称Unix之父 BCPL和B是弱类型的语言 符号英文 从另外一篇文章[^1]学习来的: symbol English plus minus slash \ ...

阅读更多
tcpl读书笔记:输入和输出

本文为the c programming language一书的笔记 错误处理——stderr and exit 为什么要有stderr呢? 当我们用到屏幕的时候,如果出错了,可以通过stdout把错误信息输出到屏幕,但是, 如果我们不是打印到屏幕,而是重定向到文件或者其它文件,就不能使用printf等函数 来输出错误信息了。这时候就该stderr上场了,因为它只会输出到屏幕。 #include <stdio.h> int main() { fprintf(stderr, "slfdjdfj\n"); return 0; } 结果如下:...

阅读更多
tcpl读书笔记:指针和数组

本文为the c programming language一书的笔记 多维数组 对于一个二维数组,如果要作为函数参数来传递,必须要包含列数,行数可加可不加。 因为,传递过去的是指向行的指针。比如,可以这样: fun(int arr[2][13]) { ... } 也可以这样: fun(int arr[][13]) { ... } 还可以这样: fun(int (*arr)[13]) { ... } 注意,*arr一定要加括号,因为[]的优先级比*要高。 命令行参数 看下面的代码: #include <stdio.h> int main(int...

阅读更多
tcpl读书笔记:结构体

本文为the c programming language一书的笔记 基础 原来可以这样初始化: struct point { int x; int y; }; struct maxpt = { 300, 200 }; 这样就定义了一个坐标为(300, 200)的点。 在定义的时候初始化: struct key { char *word; int count; } keytab[] = { "break", 0, "continue", 0 }; sizeof不能用在#if里面,因为预处理器...

阅读更多
tcpl读书笔记:类型与表达式

本文为the c programming language一书的笔记 数据类型和大小 有关short,int,long的大小。 它们的大小由编译器决定,但是有一个规定,short和int至少要16位,long至少要32位。 short必须小于int,int必须小于long 常量 1234L表示常量1234类型是long,1234u表示类型为unsigned,1.23f表示类型为float, 1.23L表示类型为long double。 回顾转义字符: character function \a alert \b ...

阅读更多
带上眼罩测试软件

本文为"software testing"一书的读书笔记 动态黑盒测试 动态,因为运行程序来测试。黑盒,因为看不到代码。还有一个名字:behavioral testing. test case,测试用例,是你在测试软件的时候定义的特定输入。一般根据产品说明 书来制定测试用例。 test-to-pass and test-to-fail 有2种方法来测试软件 测试它通过 测试它不通过 就像测试一辆车一样,先要测试一下轮胎大小合不合适,刹车有没有问题等,再开足马 力上路,看有没有问题。前者是测试它通过,后者是测试它不通过。如果不先测试它通 过,则一上路你就会死掉。所以: ...

阅读更多
检查产品说明

本文为"software testing"一书的读书笔记 原来在项目经理写好产品说明书,软件测试师就要开始工作,检查产品说明书里面有 没有什么bug,这样可以大大减少整个项目的开支。 一个简单的计算器软件的产品说明书就需要几百页。 黑盒测试和白盒测试 黑盒测试,black-box testing,测试师不知道软件里面是怎样操作的,他只给一个 输入,得到一个输出。他不知道里面发生了什么,不知道为什么会得到那样的输出。 黑盒测试有时也叫功能测试(functional testing)和动作测试(behavioral testing)。 白盒测试,white-box tes...

阅读更多
个人的成功——从依赖到独立

本文为《高效能人士的七个习惯》一书的笔记 掌握“选择的自由”——操之在我的力量 人有“选择的自由”,这种自由来自人类特有的四种天赋: 自我意识(self-awareness) 想像力(imagination) 良知(conscience) 独立意志(independent will) 追求圆满人生的首要准则——“操之在我”(proactivity) 操之在我的涵义:采取主动,为自己负责。个人行为取决本身,而非外在环境; 理智可以战胜感情;人有能力也有责任创造有利的外在环境。 人生有三种价值: 经验价值,来自遭遇 创造价值,来自个人创造 态度价值,来自面临困境时的反应 在所有进步的...

阅读更多
人际关系的成功——从独立到互赖

本文为《高效能人士的七个习惯》一书的笔记 你不是一座孤岛 开一个感谢账户,存入六种感情存款: 了解别人 注意小节 信守承诺 阐明期望 诚恳正直 勇于道歉 大家都可以是赢家——利人利己的人际观 人际关系的观念可归纳为六类: 利人利已 损人利己 损己利人 两败俱伤 独善其身 好聚好散 赏罚分明也很重要,不可全凭主管个人好恶。赏罚方式一般可分金钱、精神、机会、责任 四层面。加薪、减薪是金钱奖惩;精神鼓励指嘉勉、表扬、尊崇,反之则是失去尊敬、依赖。 除非温饱都成问题,否则精神奖励的价值往往超过物质奖励。机会奖励包括进修等福利,责任 则是对表现良好者赋予重任。 做个“双向传播”的聆听...

阅读更多
重新探索自我

本文为《高效能人士的七个习惯》一书的笔记 由内而外全面造就自己 引言 你希望在工作上享有更多自主吗 那么先做个更负责尽职的员工吧 你希望获得信任吗 那么先做个值得信任的人吧 阿斯匹林式的建议只能暂时解决问题 唯有反求诸己,从观念与品德做起 由内而外全面造就自己 才能使你在人生各层面表现出众 名言 真正卓越的人生,少不了正直的生活。 ---David Starr Jordan 人性可善可恶,冥冥中影响着我们的一生,而且总是如实反映出真正的自我,那是伪装不了的。 --Williarm George Jordan 要改变现状,就得...

阅读更多
软件测试的现状

本文为"software testing"一书的读书笔记 测试公理 不可能完整地测试一个程序 原因有: 可能的输入是巨大的 可能的输出也是巨大的 软件的使用方式是多种多样的 软件说明是主观的。 软件测试是一个冒险的工作 随着测试用例的增加,找到的bug会越来越少,从而测试的代价就越来越高,我们要 合理地设置测试用例的范围,减少测试的冒险性和成本。 测试并不表明有的bug不存在 你哪里找到的bug越多,那里的bug就越多 原因有: 程序员可能会在某天很开心,于是写出的代码很好,可能在某天很不开心,写出来的 代码就有bug,于是bug都聚集在一起。 程序员总是犯同一个...

阅读更多
软件测试读书笔记:软件开发过程

本文为"software testing"一书的读书笔记 产品的组成部分 用户需求 产品说明书 进度表 设计文档 架构 数据流程图 状态转换图 流程图 易懂的代码 测试文档 测试计划 测试样例 bug报告 测试工具 测试总结 软件项目人员组成 项目经理: 写产品说明书,管理进度,做重要决定 系统架构师: 设计整个项目的架构,通常是技术专家。 程序员: 设计并写代码。 测试师或QA(quality assurance): 找出并报告软件的错误 技术文档编写者: 写用户文档,技术文档的。 配置管理和软件打包者: 把软件文档等打包,写安装说明的 软件开发生命周期模...

阅读更多
软件测试读书笔记:软件测试背景

本文为"software testing"一书的读书笔记 什么是bug 当下面5种情况中的一种出现时,说明有bug了 软件没有做产品说明书说应该做的事情。 比如计算器相加应该得到正确结果,而它没有得到。 软件做了产品说明书说不应该做的事情 比如计算器死机了。 软件做了产品说明书没有提到的事情 比如某个计算器的产品说明书里面没有说要实现开平方功能,而这个软件却实现了, 这也是一个bug,因为测试师没有准备这个功能的测试用例,可能会导致更多的错误。 软件没有做产品说明书没有提到的但是应该做的事情 比如产品说明书没有提到电池没电了会怎样,而程序员需要考虑这种情...

阅读更多
c-plus-plus-interview-review

+++ categories = ["面试"] date = "2016-05-27T20:50:49+08:00" tags = ["面试"] title = "c plus plus interview review" +++ 这是我看了《C笔试面试宝典》一书的笔记 new, delete, malloc, free的关系 new和delete是C++的 运算符 ,new调用构造函数,delete调用析构函数。 malloc和delete是C运行库的函数。 delete和delete[]的区别 delete只会...

阅读更多
design-guide

+++ categories = ["Design"] date = "2017-03-31T10:50:49+08:00" tags = ["Design"] title = "浅谈后端业务系统设计" +++ 这里将说说个人对设计的想法,必然会有争议之处,内容包括系统之间设计,系统内部模块之间设计,细到每个函数的设计。 系统设计 不要为了拆系统而拆系统 一般我们会因为下面几个原因拆分系统: 这个模块被几个系统共用 这个模块压力很大,独立出来可以扩展分流,优化 这个模块代码量太大,需要很多人维护,独立出来,易于管...

阅读更多
improve-code-readability

+++ categories = ["编程"] date = "2016-05-27T20:40:43+08:00" tags = ["编程"] title = "improve code readability" +++ 这是我读 "the art of readable code" 一书做的笔记 简化循环和逻辑 making control flow easy to read 下面的代码: if (length >= 10) 要比: if (10 <= length) 更容易...

阅读更多
write-down-the-reStructuredText-syntax-I-frequently-use

+++ date = "2016-05-27T16:35:19+08:00" draft = false title = "reStructuredText语法笔记" +++ reStructuredText用于排版非常好。但是,和C++一样,越是灵活,越是可扩展,越是复杂。 有些语法,你永远记不住,我经常遇到一些表示方法(比如说超链接),忘记了语法,每次都 要去Google。为了不这么麻烦,我决定记下去,以免下次忘了又要去查。 大部分都来自 这里 。 代码块 在段落的结尾使用 :: 符号, 然后输入一个空行,然后是代码(必须缩进,空2格或4格), 然后...

阅读更多
redis-max-client-limit

+++ categories = ["Redis"] date = "2017-03-30T22:50:49+08:00" tags = ["Redis"] title = "记一次redis连接数超限的事故" +++ 最近出了一次事故,应用crash,并报错: max number of clients reached. 查了一下reids的连接: netstat -anp |grep 6379 | wc -l 发现,连接数达10000多个,大致扫了一下,发现某个ip的连接占了7000多个。于是去把这个ip的服...

阅读更多
my_code_style

为了让自己的代码更容易阅读,我需要遵守一些规范,列举出来,每日三省 吾身,下面的规范我做到了没有?。 我使用的是K&R风格。 双目运算符两边要有空格 关键字后面如果有括号,之间要加一个空格,如for和if。主要是用于区分函数。 关键字后面如果有括号,)后面加一个空格,再加{ 逗号(,)后面都要加一个空格,这样貌似比较好看。 无论什么情况,区块都要写花括号。 函数的声明的参数全部都要写参数名字,不能只写类型。 要写成int *p而不要写成int* p; 初始化数组时,花括号里面要加2个空格,如{ 1, 2, 3 } 对于注释,/* comment */,加空格,// comment,也...

阅读更多
reorganizing_code

本文为"the art of readable code"一书的笔记 extracting unrelated subproblems 要封装一些和本功能无关的子问题到另外一个函数上。 对于一些工具的类或函数(字符串操作,哈希表等),就分离出来。 one task at a time 每个函数应该只实现一个功能,不要实现多个功能。 turning thoughts into code 记住爱因斯坦的这句话: You do not really understanding something unless you can explain it to your gr...

阅读更多
simplify_loop_and_logic

本文为"the art of readable code"一书的笔记 making control flow easy to read 下面的代码: if (length >= 10) 要比 if (10 <= length) 更容易看懂。这是很显然的。而在C语言中,有的人为了避免=与==的错误,常常把 代码写成: if (10 == length) 这种做法是为了避免错误的。其实在我看来,这明显是在掩饰自己区分不了=与==的 弱点,如果你真的理解赋值与相等的含义,就从来不会在比较相等的时候写成=,以 我使用C语言这么多年来,我从来没有犯过这种错误。上...

阅读更多
surface

本文为"the art of readable code"一书的笔记 packing informations into names choose specific words 书上说到getPage(url);这个函数的名字,根据我以前的看法,这绝对是一个好名字, 但是作者却批评这种命名方式。作者说,get太模糊了,我们看不出来它是从缓存中get还是 从数据库中get,还是从互联网上get。如果是从互联网上get,则应该使用fetchPage或者 downloadPage()。我觉得这个说法非常好,我以后给变量或者函数起名字的时候也要注意 这方面的东西了。 avoid...

阅读更多
write_readable_select_sort

最近在看the art of readable code,突然想起来,自己以前写的代码都不易懂。 以选择排序为例,我以前是直接把它记住的(当然是在理解的前提下),其中的一些 下标i,j,k,直接记住人家的代码的,如果要我重新写,我还是会用i,j,k,造成了 硬性的思维,现在看来,只要记住算法,用自己的方式来写出的代码才是好的代码。 下面的选择排序是经典的课本上的代码: void select_sort(int *arr,int len) { int i,j,k,temp; for(i = 0; i < len - 1; i++){ k = i; ...

阅读更多
alipay

环境 os browser Archlinux firefox 情景 最近空间和域名都过期,花钱的时候到了。用了这么久linux还没上过支付宝, 一上问题就来了,居然要安装安全控件!幸好支付宝支持linux和主流的浏览器, 但是问题是我装上了,也提示成功了,还是没效果,于是google到了一篇文章, http://www.longda.us/?p=135 ,才把问题给解决了。 但是要翻墙才能看! 原因是Arch太新了,它已经使用了libpng15,而支付宝安全控件还在使用 libpng12,于是要创建一个符号链接: ln -s /lib64/libpng15.s...

阅读更多
filezilla

本地目录不显示隐藏文件 动机 我在浏览本地目录的时候,在主目录老是显示一大堆隐藏文件和目录,想找个目录都 麻烦,于是需要配置让它不显示隐藏文件。 解决办法 查看 --> 文件名过滤器,在左边的本地过滤器选上configuration files,然后 确定,OK了! 参考自:http://qing.weibo.com/tj/6c0a6319330027wn.html 思考 如果要让服务器不显示隐藏文件呢?当然,勾选右边的同样选项! 兼容性 这个办法在filezilla 3.6.0.2上测试可以,如果你发现这篇文章更新的时间离你 太遥远了,你的版本比这个高,可能这个方法不适用。...

阅读更多
git

clone older version the following git clone [addreee] my_repo cd my_repo git reset --hard [the commit hash] just find the commit hash of the version or just git checkout [the commit hash]...

阅读更多
how-to-use-generator-in-sails

+++ categories = ["Nodejs"] date = "2017-03-13T22:50:49+08:00" tags = ["Nodejs"] title = "如何在Sails.js中使用generator" +++ 由于历史原因,公司的App项目用Sails.js框架来开发,那时候还没有ES6,当然是一层一层callback下去,后来引进了Async和Thenjs,代码才清晰了很多,但是遇到复杂的业务逻辑,写起来依旧痛苦。 在这个不写ES6都不好意思说写Nodejs的年代,天天写callbac...

阅读更多
iterative

认知 unified process(UP) rational unified process(RUP) 什么是迭代发展 看了书,个人觉得,迭代发展就是把一个项目完成的时间分为很多小段,每段时间完成 设计->实现->集成->测试等完整的工作,不断迭代下去,最后完成整个项目。这个即 所谓的螺旋模型。 迭代发展的优点 更早地降低风险 更早地看清进度 更早地得到反馈和用户参与 降低了管理上的难度 迭代周期中的学习可以用于改善下一迭代周期的工作 迭代发展的周期长度 UP推荐迭代周期为两到六周之内 UP的阶段 inception开始--对业务例子、范围的总体估计 elab...

阅读更多
ooad

分析与设计 分析强调的是问题和需求的调查(investigation),而不是答案。 设计强调的是满足需求的概念型答案(conceptual solution),而不是实现。 分析:do the right thing。设计:do the thing right。 面向对象的分析与设计 面向对象的分析强调找到并描述问题领域中的对象 面向对象的设计强调定义软件对象并定义让它们如何相互结合以满足需求。 面向对象模型的一个例子: 需求和分析 use case diagram interface model business/domain object model application o...

阅读更多