大数据常用算法——大数据日知录读书笔记

Keywords: #算法
[TOC] 布隆过滤器(Bloom Filter) 场景:用于检测某个元素是否是海量数据集中的成员。 原理:即判断一个数是否在集合中。 准备一个位数组,全部置0. 准备K个散列函数,可以将该元素映射到该数组中的K个点,并将改点置为1. 如果映射中的点有一个为0则不存在,如果均为1可有可能存在。 LSM树 场景:对写效率要求高的场景,能将大量的随机写操作转换成批量的序列写。缺点读效率有降低。 Merkle哈希树(Merkle Hash Tree或称哈希树、Merkle树) 场景:海量数据下快速定位少量变化的数据内容。 Cuckoo哈希(Cuckoo Hashing) 场景:有效解决哈希冲突。

openWRT路由器的一些小问题

Keywords: #openWRT
lan内指定域名到固定IP 修改/etc/dnsmasq.conf,增加一行 address=/www.xxx.com/192.168.1.100 其实发现修改/etc/hosts有同样效果,需要重启 定制版里面翻墙路由表记录的是域名,所以要添加新被封锁网站需要修改/etc/vpn.conf

文件系统操作简述

Keywords: #Linux #文件系统
[TOC] 基础知识 磁道 Track:一个磁盘上 的一个圆圈为一个磁道,而许多同心圆组起来就是盘面。 扇区 Sector:磁道上是有若干弧形组成,每个弧形就是一个扇区,扇区大小是固定的为512bytes。 柱面 Cylinder:每个盘面都被划分为数目相等的磁道,并从外缘的0开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。柱面是由半径相同的一组同心圆组成,形成一个圆柱体。柱面是分区的最小单位。 磁盘分区就是指指定分区的起始和结束柱面。 第一个扇区里面有硬盘的主引导记录MBR以及分区表的信息。 MBR站446bytes,partition table占64bytes。 由于分区表只有64bytes,所以最多只能记录四条分区记录,分为主primary分区和扩展extended分区。扩展分区还能再分出逻辑分区logical。 扩展分区最多只能有一个,操作系统限制的。 能被格式化的只有主分区和逻辑分区,扩展分区无法格式化。 文件系统中,有如下区分: super block:记录此文件的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式和相关信息等。 inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码。 block:记录实际文件的内容,若文件太大时,会占用多个block。 文件系统会先格式化出inode与block的块。 通过找到inode再来找到对应的block成为索引式文件系统。而FAT格式的没有inode,每个block号码都记录找在前一个block中。 一般格式化后block的大小就固定了,一般可选1KB,2KB,4KB。每个block里只能放一个文件。 由于每个inode只有一个文件,所以文件系统能创建的文件数量和inode的数量有关。而由于inode的大小有限,单个文件大小也有限制,但是文件系统能通过block来记录其他block。 拿到新硬盘三部曲 分区 2T以内 fdisk -l 找到系统所有分区 fdisk /dev/sda 对磁盘进行分区,这里没有123编号,因为是对磁盘分区而不是对分区分区 这时会出现帮助提示,m为帮助,这里可以进行操作,一般步骤为: n 新建分区 新建后首先会让选择分区类型,扩展分区或者主分区,扩展分区一般不能直接用,而要被再划分成逻辑分区。 还能设置分区大小,比如+1GB p 显示现有分区 q 不保存退出 d 删除分区,后面接分区编号 w 保存所有改动,如果不w,则所有改动都不生效 大于2T parted /dev/sda print 列出本机该磁盘的分区资料 parted /dev/sda mkpart primary ext4 1MB 1.5TB 这里的mkpart是新建分区,类型有primary,extended,logical,后面是起始容量和结束容量 parted /dev/sda rm 2 后面的2代表分区编号,这里执行就马上删了 格式化 mkfs -t ext4 /dev/sda1

安装SAMBA服务

Keywords: #Linux #samba
[TOC] 内网linux搭建samba服务可以跨平台给windows提供文件共享,同时ipad和Android也能访问到,很棒。 安装 apt-get install samba #安装samba服务组件 配置 开启用户验证,取消注释 security = user global里新增这两行,开启用户帐号映射功能。下面还能限制访问权限 username map = /etc/samba/smbusers hosts allow = 192.168.0.101 192.168.0.103 192.168.0.102 192.168.0.100 192.168.0.104 在最后一行加入如下内容 [share] path = /data/ available = yes browsealbe = yes public = no writable = yes valid users = cubie,root 编辑/etc/samba/smbusers,这里的映射表示我可以使用一个我习惯的用户名,而smb则使用系统的存在的用户去登陆,这两个账号之间是一个映射关系。 cubie = lucas guest root = luca 用户使用luca或者guest登陆,实际用的却是cubie的账号。这儿如果虚拟账号中带空格,则需要用双引号把账号包起来。 使用pdbedit -a cubie为smb新增一个访问用户,然后在提示下输入访问smb的密码。cubie的是linux中存在的用户。 然后使用service samba reload和service samba restart重启。 其中还能使用gpasswd -a cubie share把cubie添加到share组里。 在windows里连接到samba服务器。 有一个优化,针对CT板子的,连接在这,在global段中加入 #以下为优化项 follow symlinks = no wide links = no # enable some read/write tuning,启用读写缓存等等 aio read size = 16384 aio write size = 16384 aio write behind = true write cache size = 2097152 max xmit = 65536 large readwrite = yes # Use sendfile for reading files efficiently: use sendfile = yes min receivefile size = 16384 getwd cache = true

cubietrunk入手后操作小节

[TOC] 刷系统 我要刷的是debian,image位于百度云,刷系统到nand需要phoenixsuit软件,下载地址 刷系统的时候先关掉ct电源,电脑中选中需要刷的image文件,摁住FEL线,连接otg线,然后开始刷机 刷完后,连接网线,然后使用ssh连接到ct 开启网络连接 如果是有线,直接连接开机就行,默认DHCP自动获取ip,然后SSH连接就行,也内置的。 特殊情况下可以使用TTL线,接线如下:黑色——GND,红色——不接,绿色——RX,白色——TX 然后使用shell连接,先去电脑设备管理器里找到所用端口,比如COM7 连接的时候选择SERIAL协议,然后在SERIAL配置里选择Port7,配置如下: 然后连接 无线的话,使用ttl线连接好,ct已经内置wifi模块,ifconfig查看是否加载,类似wlan0,如果没有,执行$modprobe bcmdhd,不过ct这个版本的已经写到/etc/modules了,如果没有还需要写到这里。 为了访问方便,需要在路由器给ct设置为静态IP。然后还需要到/etc/network/interfaces修改eth0为静态方式: iface eth0 inet static address 192.168.0.150 netmask 255.255.255.0 gateway 192.168.0.1 编辑/etc/network/interfaces,现有版本里已经写好了,修改好自己的SSID和password就行,不过这种只支持一个SSID。然后重启就行。 不过我们一般要使用多个热点,在不同地方可以自动连上,参考这个文章 总结一下使用无线的流程。 首先需要有个AP(热点)。 然后设备需要有无线网卡设备,usb无线网卡或者内置的wifi模块,在ct里内置了wifi模块,驱动就不用管了。否则还得手动添加驱动, apt-get install wpasupplicant 如果用了usb无线网卡,首先lsusb查看设备是否被usb设备识别。然后使用iwconfig查看是否被内核加载,如果没有看到则需要加载正确驱动了。 检测完后,启动网卡,ifconfig wlan0 up 然后搜索周围的AP,iwlist wlan0 scan 涉及到两个命令,ifconfig wlan0 up和ifconfig wlan0 down开启或关闭网卡wlan0 然后看看网卡的配置文件,在RedHat里是放在/etc/sysconfig/network-scripts目录下的一堆文件里的,但是在debian里是放在/etc/network/interfaces里,无论多少配置都放在同一个文件里。 auto lo eth0 #自动配置加载lo和eth0 iface lo inet loopback #为lo接口设置为一个loopback本地回环地址 iface eth0 inet dhcp #为eth0设置为通过dhcp自动获取ip,也可以是static静态地址自己配置参数 #allow-hotplug wlan0 #表示wlan设备可以热插拨,一般USB无线网卡会有这个选项 auto wlan0 iface wlan0 inet dhcp pre-up ip link set wlan0 up #这儿有pre-up、up、post-up、pre-down、down、post-down等一组命令,分别定义加载网卡各个时刻执行的操作,这个代表启动前执行ip link set wlan0 up命令 pre-up iwconfig wlan0 essid luca #同理,搜索essid为luca的网络 wpa-ssid luca wpa-psk postcard 修改后然后执行/etc/init.

Sublime基本操作

Keywords: #编辑器
ctags ctrl+t ctrl+R 重建索引 ctrl+t ctrl+t或ctrl+shift+左 代码定位 ctrl+t ctrl+b或ctrl+shift+右 定位回跳 ctrl+p 快速搜索框 直接搜索为文件名导航 @为函数 :行数跳转 ctrl+` 命令行模式 ctrl+l 选择当前行 ctrl+shift+c 编码转换

SVN操作

Keywords: #SVN #版本控制
[TOC] 创建分支 svn copy http://../trunk http://../branches/v1 -m '注释' 查看最新创建的分支 svn ls http://../branches/ |tail -n 1 分支合并到主干 进入主干的工作副本 cd ~/dev svn co http://../trunk cloud cd cloud 确保工作副本是干净得,svn status查看没变化的文件。 预合并,在主干副本目录进行 svn merge --dry-run -r100:200 http://../branches/v1 将版本号100到200间的改动合并。 合并分支 svn merge -r100:200 http://../branches/v1 确认要合并的分支 查看状态 svn status 查看改动 svn diff 提交改动 svn ci -m '注释' 恢复历史版本 恢复就是反向合并 svn merge -r201:200 http://../trunk svn ci -m '撤销某版本的改动' SVN仓库的建立 仓库是一个版本管理中心,运行在svn的服务器端。一般在服务器上建立一个仓库后,然后我们把工程导入到svn的仓库中,完成仓库的初始化。 首先建立仓库: svnadmin create /data/svn/repo1 这样会在repo1仓库中多出一个conf目录其中包含一些配置文件,需要依次去修改,比如把serve配置里的游客可读改成none等,给仓库命名。然后设置用户名以及密码。这里面是需要把一些注释去掉的。 然后启动svn服务器: svnserve -d -r /data/svn --listen-port 9999

Yii框架入门

Keywords: #PHP #Yii
[TOC] 原本一心想建立一个强大无比的框架,然后再开发各种牛逼透顶的应用的。 但是我的框架啊拖了四年都每次夭折啊。 原本还想继续拖着,直到我遇见Yii框架,靠,这TM思路不是和我一模一样嘛?连框架路径名字都一样叫做framework?难道…… 所以决定就用Yii了。 表单生成和验证 表单提交整个过程一般是从view的页面开始的,提交到control/action对应的方法中,然后调用model实例进行save等操作。 表单的数据提交到control后,首先需要实例化对应的model,然后把$_POST数据赋予$model->attributes,这样会把$_POST中的属性和值赋予到$model->属性=值。 验证表单字段时可以使用CModel类中的rules方法配置过滤,也可以使用一个额外的LoginForm类完成登录验证,LoginForm类继承CFormModel,CFormModel其中主要提供一个基于事件的表单处理机制,因为这个过程是不需要数据库操作的而只是基于验证场景的。 因为CFormModel继承CModel,所以其本身也能重写rules方法独立完成validate过程。 rules方法的规则建立后,只能通过手动执行$实例->validate()或者其在执行save动作的时候会自动执行。 也可以在model类比如User类中定义rules进行过滤操作(因为一般继承链User->CActiveRecord->CModel),在control中执行的时候,调用model类 $model=new User('register') 其中register为scenario(场景),给User类定义场景主要是当其调用rules进行验证参数的时候,需要对不同场景进行对应的过滤。 rules的规则中的on对应scenario(场景),这些场景主要使用action,通过new model的时候设定,也可以是insert,update,delete等场景。其中的第二个参数的验证方法也可以是自定义。具体rules的规则看这儿。 用户身份验证 用户验证类为UserIdentity,是用来验证用户输入的用户名和密码是否通过的类,验证方法输入为用户名和密码,返回为错误码,如果正确的话会把用户信息name,password存入本类中。 UserIdentity位于应用的component目录下作为一个组件存在。 继承关系如下: UserIdentity[应用中]->CUserIdentity[框架中]->CBaseUserIdentity[抽象类]->CComponent[组件]IUserIdentity[接口] 实现具体方法->包含username,password成员和构造方法,无auth实现->定义错误码等->定义接口 这个类一般用于login时验证,一般在建立应用是需要重写authenticate方法,注意重写的时候要重写getId和getName方法,在后续用户登录中要使用,如下 public function authenticate() { $user = User::model()->findByAttributes(array("email" => $this->email)); if (empty($user))- $this->errorCode = self::ERROR_USERNAME_INVALID; elseif (!CPasswordHelper::verifyPassword($this->password, $user->password)) $this->errorCode = self::ERROR_PASSWORD_INVALID; else { $this->id = $user->id; $this->name = $user->username; $this->errorCode = self::ERROR_NONE; } return !$this->errorCode; } 用户登录 一般在上面的用户验证完成后,进入用户登录组件,一般使用 Yii::app()->user->login($this->_identity,$duration); 完成,这儿调用的是框架下的CWebUser类的login方法实现,主要实现用户的session机制。 其中的$this->_identity为已经完成验证步骤的loginForm类的实例。 当用户完成登陆后,用户信息会存在Yii::app()->user中,可以在其中获取。用的多的如下 Yii::app()->user->name Yii::app()->user->id Yii::app()->user->isGuest 对于不同的action,有些页面是登陆用户才可访问的,有些是管理员才可见的,这种控制的Yii中统一到了controller中filter方法中。 一般我们可以使用内置的accessController方法

Nginx配置文件解析

Keywords: #Linux #Nginx
[TOC] 在配置Nginx的时候其实有很多东西可以学习的呢。 基础了解 配置中的http{ server{ location{ }}}分别表示为HTTP服务器提供配置上下文,为其中一个虚拟主机提供配置(可配多个),为某个URI提供配置(可配多个)。 root为请求设置根目录,如 location /i/ { root /data/w3; } 把URI中/i/a.php响应到/data/w3/i/a.php上来。当server和location同时存在root的时候,会遵循一个继承的机制,底层继承高层,底层覆盖高层。 server中应该包含如下内容,为Nginx提供PHP服务 location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 为泛域名配置二级域名多域名 去域名解析商添加泛域名*解析到IP 添加如下关键代码,根据二级域名响应到对应的文件夹 server { server_name ~^(?<subdomain>.+).dulcim.com$; root /data/wwwroot/html/$subdomain; } YII中实现路由匹配 如果路径不是真实存在,就rewrite到index.php脚本。据说这种方法需要pathinfo所以有一点性能问题,而且有一个安全问题,还没时间研究。 location / { if (!-e $request_filename){ rewrite ^/(.*) /index.php last; } } 参考文档 Nginx配置模块文档 Rewrite基本语法

Git基本操作指南

Keywords: #git #github #版本控制
[TOC] 把代码托管到Github是一个高(zhuang)大(bi)上的方法,操作一会后发现简直找不到不用的理由了,而且发现阿里云居然自带git命令呵呵。 在本地commit文件的状态变化 借用网上的图片:) 新增一个文件为未跟踪,使用git status能看到新增的文件,但是不会被提交 使用git add后能把文件添加到版本库,这时候是一个跟踪的状态,和从项目克隆的文件保持一致叫做未修改 当已经跟踪的文件被改动时,会进入一个已修改的状态,但是提交的时候还是不会被提交,因为他还是未暂存 版本库里已跟踪的文件被修改时,也只有再变成已暂存状态才会被提交,要再使用git add(复合命令啊)把文件变成已暂存。 当git commit的时候只有新增的文件变成已跟踪,或者已跟踪的文件被修改又被加到暂存区了才会被提交,这点和svn不同,svn中已跟踪的文件任何修改都能直接被提交 使用git status能看到Changes to be committed提示的都是能被提交的。 不过可以使用git commit -a能实现svn的提交效果:所有已跟踪的文件如果被修改都能直接被提交。 本地和远程服务器的交互 先理解一下:git是一个分布式的版本控制方式,所以每个人本地都是一个完整的版本库, 同一个项目在每个人的电脑上都是一个完整的版本库, 同样同一个项目下的每个人的版本库都可以成为其中某一个人的该项目下的远程库 图片是网上找到的:) 下面来看看同一个项目labs在不同人的电脑上的版本库之间的关系 如图,假设我们都在github上建立一个统一的项目labs,项目下现在有alice和bob两个人,他们也都在github上有fork分支,如上图。 现在我要加入了,我也fork到了我的github上,而在本地我首先 git clone git:xxx/公共的/labs.git 这样我本地就有了一个labs的完整版本库 这个时候我 git remote -v #-v代表详细信息 这样看到了 origin git:xx(fetch) origin git:xx(push) 类似信息,这代表github上的公共仓库在我本地的别名叫做origin,这个我第一次clone的时候默认就是这个名称了,可以改的 这里origin代表的就是git:xx这样的远程地址,我也可以把这个叫做labsCommon,只需要clone的时候指定-o参数 git -o labsCommon clone git:xxx/公共的/labs.git 这样这个远程公共仓库就被我本地以labsCommon来识别了 当我修改了本地版本,要提交到远程公共仓库,执行如下 git push labsCommon master 这样代表我把本地版本库最新的更新到远程仓库labsCommon的master分支下 当然我本地也能把我的代码提交到远程我自己的仓库下,或者bob的远程仓库下,如果有权限的话 git remote add myLabs git:xx 这样加入后,git remote -v就能看到我的本地版本库对应的远程仓库多了一个myLabs labsCommon git:xx(fetch) labsCommon git:xx(push) myLabs git:xx