Archive for 算法-编程

使用django写的微信应用,几个月前了,现在又看了一下。 当时想做一个宠物照片分享,信息查询的应用。现在发现微信应用不适合做这种功能这么全的,要依赖网页那样没意思了。接触微信多了也发现这个手机app也没什么意思,就用来做宣传什么的不错,再一个做个抽奖,定时发文章的那种应用比较适用。 用django写主要是操作数据库什么的也方便,其实就一个url请求,官方还有一套验证,不过如果url足够保密,不验证也无所谓。 然后解析xml,按照不同的动作做不同的事。已经实现的功能中,最大的一个是能够搜索宠物店或者宠物医院的。 数据来自百度地图,让同学帮忙抓的,直接用百度地图的开发api,抓取限制足够轻松的抓取完。 我用的结巴分词,分析的地址,店名数据,制作搜索词。用的whoosh检索。 这两个放在sae上时,不能创建文件,必须制定一个目录,由于店面不会长变,结巴分词的也不更新,所以我直接在项目下建的目录,然后本地生成,直接svn提交到sae上。whoosh是直接用api的很方便很爽,没有选择一些集成到django的插件,感觉配置什么的很麻烦也不爽,不如直接下载下代码放到项目目录下直接调用来的爽。

Continue

汗,简直是无奇不有,在lisp群里看到他们说这个语言。当时就感觉很有意思,然后搜索看了一下wiki和官网。当时只是看了wiki的表格,那些文字没看。就感觉和草泥马语言一个东西,挺简单的,于是想自己实现一个python版的。然后没几天就写完了。 主要借助wiki的中文介绍,官方的例子程序和下载的haskell源代码。haskell以前没看过,然后发现看代码一点不费劲。在lisp群里说,妮神说他和erlang差不多,我才意识到可能是以前看过erlang的原因。parser是编写边测试正确的,vm是一口气写完再测的,然后就不想测了,但是开始官方的例子有的跑不通,没办法,就一个指令一个指令的写功能测试到基本正确。然后能跑通官方例子,大部分指令都测过基本功能,除了流程的没写。 说说这个语言,只有三个字符:空格,tab,换行。写完就是一片空白,说是有助于防止别人将代码打印带走。我去真蛋疼。让我写我会用“\n\t”代替,用代码再生成,不会用真的空白,那样怎么看。编辑器还好,可以将空格和tab的背景颜色修改一下,换行就是最后的换行。github上就是整个一片白。说这个和草泥马语言差不多,其实我把三个字符换成草泥马三个字,也就真的差不多了。 是换行符的坏处就是,可能一行不是一个完整的语句,下一行又是两个语句。下意识的总喜欢把一行想成一个基本完整意思的代码。所以这个换行符很带疼,其实可能也是指令设计的不好。 项目地址:python-whitespace

Continue

搜索找到lexer都有个参数stripnl=False,默认是True。 HtmlFormatter的时候还是不行,哪一个空行还是会过掉。 然后我就判断开头是'\n'的时候,在前边加上一个空格,然后格式就对了

Continue

开始想用python做一个键盘记录的工具,搜索linux keyboard hook,发现找不到东西。后来发现原来linux直接读设备文件就行了,才恍然大悟。 /dev/input/下有十多个event。要找到键盘对应的event,查看grep keyboard /proc/bus/input/devices -A 12。 然后找到一点资料,自己写了一段程序:

# coding: utf-8
import os
import struct

fmt = "llHHI"
size = struct.calcsize(fmt)
filename = "/dev/input/event3"

fd = os.open(filename, os.O_RDWR)
while 1:
    op = os.read(fd, size)
    timeval, suseconds, typ, code, value = struct.unpack(fmt, op)
    print typ, code, value
最后又找到两个库,用来读或模拟键盘按键的(或别的设备)。python-evdev和python-uinput。

Continue

啃了python源代码,从python.c开始慢慢看到token获取,学到很多东西,但是我看到python源代码也有很多可以优化的地方。很多参数、变量可以不要的,同样的判断在不同地方使用的不同方法,我靠看的我晕头转向。一到晕头转向的时候,我就重新从有疑问的地方再走一遍,认真看关键代码,然后才能看懂这一部分的功能。 语言的基本语法想个差不多了,天马行空了一下,与开始想的差距太大。

Continue

n久前就有这样的冲动,这次读了淫神的代码后,决定还是动一下手。 语言语法主要类似python的,靠缩进来定义代码块,动态语言/静态语言还没想好0 0(应该会静态类型)。 以前想做的时候看过,flex,yacc/bison什么的,看了淫神的代码突然想自己实现一下,问题是难免的,出现问题解决问题。不下手不会知道问题会出在哪,这也是成长过程。看了淫神的代码开始想使用python写,后来觉得有必要复习一下c了,c语言用的太少了,是时候提高一下水平了。 再一个临时的决定是使用llvm,虽然现在还不是很懂其中的奥秘,看看文档慢慢来吧。这也是发现现在好多语言都在用来提示速度,dropbox也在搞py的实现,期待能达到更快的速度。 感觉如果用flex,bison ,llvm 写一个语言应该超简单。。。当然是写一个玩的而不是用的。 我看了淫神的代码 ,然后去翻python的源代码parse部分,无从下手,打眼也抽不出来各部分功能,然后就放弃了,自己慢慢搞。汗 更新 周末,屋里又看了一下python parser部分的源代码,找到了基本流程,开始基本就在Parser/pgenmain.c和Python/pythonrun.c这两个文件,流程我也过了一遍,函数里边具体的分析没仔细看。突然感觉流程都差不多,我可以借鉴一下python的c代码,质量不用说肯定是不错的,偶卡卡。

Continue

1 安装 下载的最新的3.4, http://llvm.org/releases/download.html#3.4 Clang source code (.sig) LLVM source code (.sig) Compiler RT source code (.sig) 官方安装文档:http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary 下载的源码主要解压到正确目录就行了. mkdir build cd build ../configure make make install 编译的二进制文件在llvm-3.4/build/Release+Asserts/bin 搞定了 clang --version clang version 3.4 (tags/RELEASE_34/final) Target: x86_64-unknown-linux-gnu Thread model: posix 源里边最新的是3.3的 2 写一个c的hello world

#include 

int main() {
  printf("hello world\n");
  return 0;
}
听说clang比gcc速度快。 clang hello.c -o hello 这里和gcc生成一样的系统执行文件 生成llvm的字节码文件 clang -O3 -emit-llvm hello.c -c -o hello.bc 两种形式运行 ./hello lli hello.bc

Continue

好吧,我先把yin语言的java代码看了个差不多才想编译一下,主要原因还是想打印点测试的东西,并不是想写点什么。 总的来说像淫神说的,写得代码却是容易阅读。我java只是上学的时候开过课,再没用过,看的过程中只查了两三个的函数就看完了。看完了发现写个括号语言不算太难0 0,我的意思仅仅是学习知识不是编写一个可以用的语言。编译原理的课也开了,都是理论,传说中的龙书又是啥书的,我几分钟看来一遍,感觉和课本没什么区别。看一个编写初期的代码更容易理解一些东西。以前也想自己实现过,想想解析代码的复杂程度就怕了。 环境需求,参照github的wiki上。 java jdk 1.7,ubuntu12.04自带好像是openjdk 我以前搞安卓游戏的时候换过了。 maven 3.2 我直接从官网下载的二进制版本,http://maven.apache.org/download.cgi。解压到/opt/maven-3.2.1,vim /home/a0x55aa/.bashrc,添加export PATH=/opt/maven-3.2.1/apache-maven-3.2.1/bin:$PATH。source一下。mvn -version看一下。应该没问题了 然后mvn compile,自动下了一堆的东西0 0。pom.xml配置文件也看不懂。 mvn exec:java -Dexec.mainClass="org.yinwang.yin.Interpreter" -Dexec.args="tests/assign1.yin" 又下载了一堆东西。。。java果然不是一般人能搞的。我草。太恶心了,都不知道什么用。

Continue

函数

fn line(a: int, b: int, x: int) -> int {
    return a * x + b;
}
使用fn定义个函数,参数是在括号里边的name:type对,->后面跟返回值类型。 最后一行没有分号,可以省略return,将最为整个代码段的值返回。返回空或者(),可以不写返回类型。函数参数支持模式匹配。
fn first((value, _): (int, f64)) -> int { value }
析构函数 析构函数用来定义处理文件,socket,对内存的释放。当不再访问之后,对象的析构函数将被调用,防止访问释放的资源可能会产生的动态错误。当一个任务失败,在任务中的所有对象析构函数将被调用。 定义一个链表
enum List {
    Cons(...),
    Nil
}
enum List {
    Cons(u32, ~List),
    Nil
}
哈哈 像极了clisp里边的列表, Cons应该是一个元组,元组第一个元素u32,第一个元素指向list的下一个元素。 上边的定义类似递归的思想,list有两种情况,nil是list,Cons(u32, ~List)也是list。第二种情况里边又包含一个list,这个list也应该是前边两种类型。哈哈 Cons这个名字可以随便起的,不过最好还是不改的。官方文档没有说明,多少有点疑惑(读英文文档也没自信,不知道对不对) 波浪号是必须的,表示一个指向list类型值的指针。
let list = Cons(1, ~Cons(2, ~Cons(3, ~Nil)));

Continue

结构体

struct Point {
    x: f64,
    y: f64
}
let mut mypoint = Point { x: 1.0, y: 1.0 };
let origin = Point { x: 0.0, y: 0.0 };

mypoint.y += 1.0; // `mypoint` is mutable, and its fields as well
origin.y += 1.0; // ERROR: assigning to immutable field
match mypoint {
    Point { x: 0.0, y: yy } => println!("{}", yy),
    Point { x: xx,  y: yy } => println!("{} {}", xx, yy)
}

match mypoint {
    Point { x, .. } => println!("{}", x)
}
如果结构体变量是可变的,那么结构体里边的变量也是可变的。,..表示你忽略别的所有其他struct成员变量。 枚举
enum Direction {
    North,
    East,
    South,
    West
}
enum Color {
  Red = 0xff0000,
  Green = 0x00ff00,
  Blue = 0x0000ff
}
enum Shape {
    Circle(Point, f64),
    Rectangle(Point, Point)
}
use std::f64;
fn area(sh: Shape) -> f64 {
    match sh {
        Circle(_, size) => f64::consts::PI * size * size,
        Rectangle(Point { x, y }, Point { x: x2, y: y2 }) => (x2 - x) * (y2 - y)
    }
}
第一个元素没有定义值,默认为0,依次加1。当为整数型,可用ad操作符转换成整数。进行匹配的时候,下划线代表忽略一个,”..“表示忽略所有。 元组
let mytup: (int, int, f64) = (10, 20, 30.0);
match mytup {
  (a, b, c) => println!("{}", a + b + (c as int))
}
元组结构体
struct MyTup(int, int, f64);
let mytup: MyTup = MyTup(10, 20, 30.0);
match mytup {
  MyTup(a, b, c) => println!("{}", a + b + (c as int))
}
相比元组,元组结构体有名字,所以Foo(1,2)和Bar(1,2)是不同的类型值。 只有一个元素的结构体元组是”newtype“,新名字是一个新类型,而不是一个已存在类型的别名。 碉堡的用法:
let length_with_unit = Inches(10);
let Inches(integer_length) = length_with_unit;
println!("length is {} inches", integer_length);
看完第五节,我已经想大体看完写点程序了。前边大部分也能看看程序就大体知道啥意思,不过还是把英文说的小细节看了一下。看到这里我觉得rust比golang更好,说不上来是不是细节的用法,他们有很多相似,但是感觉rust更顺眼一些。看的过程中我都怀疑是不是一帮人搞的两个差不多的东西。。

Continue