Garey's Blog–FreeBSD/PHP/GoLang

十一月 7th, 2013

第一个Go程序:UDP日志服务器

No Comments, GoLang, by garey, 11,071 views.

一个简单的UDP日志服务器,用来收集其他程序的字符串日志消息并保存到日志文件中。网络通信基于UDP协议,文件保存方式比较简单,只能作为简单测试使用,不适合线上大规模使用。

package main

import (
    “fmt”
    “math/rand”
    “net”
    “os”
    “strconv”
    “syscall”
    “time”
)

const (
    serverPort string = “:8001″
)

type Server struct {
    conn *net.UDPConn //UDP连接
    logs chan string //日志消息
}

func (s *Server) readLog() {
    var buf [2048]byte
    
        n, _, err := s.conn.ReadFromUDP(buf[0:])
        if err != nil {
            return
        }
    
        log := string(buf[0:n])
        
        s.logs <- log
    }
    
    func (s *Server) handleLog() {
    
    for {
        log := <-s.logs
        writeLog(log)
    }

}

func writeLog(log string) {
    var mode os.FileMode
    flag := syscall.O_RDWR | syscall.O_APPEND | syscall.O_CREAT
    mode = 0666
    const layout = “2006_01_02_15″
    num := getRandId()
    
    logFile := “log/log_” + strconv.Itoa(num) + “_” + time.Now().Format(layout)
    
    logstr := log + “rn”
    
    file, err := os.OpenFile(logFile, flag, mode)
    defer file.Close()
    if err != nil {
        fmt.Println(logFile, err)
        return
    }
    file.WriteString(logstr)
}

func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, “Fatal error:%s”, err.Error())
        os.Exit(1)
    }
}

func getRandId() int {
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    num := r.Intn(10)
    return num
}

func main() {
    udpAddr, err := net.ResolveUDPAddr(“udp4″, serverPort)
    checkError(err)
    
    var s Server
    s.logs = make(chan string, 200)
    
    s.conn, err = net.ListenUDP(“udp”, udpAddr)
    checkError(err)
    
    go s.readLog()
    
    for {
        s.handleLog()
    }
}

 

十一月 21st, 2012

FreeBSD下简易Http代理服务器安装笔记(Squid)

No Comments, FreeBSD, by garey, 7,314 views.

FreeBSD下简易Http代理服务器安装笔记(Squid)

一、更新ports
# csup -L 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile

二、安装Squid
# cd /usr/ports/www/squid
# make install clean

三、生成密码文件
# htpasswd -c /usr/local/etc/squid/password username
输入两次密码即可生成密码文件

四、配置
# vi /usr/local/etc/squid/squid.conf

http_port 3128
cache_dir null /var/squid/cache/
cache_access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log
cache_store_log /var/squid/logs/store.log

acl all src 0.0.0.0/0

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/password
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm bsdart.org
acl auth_user proxy_auth REQUIRED
http_access allow auth_user

五、建立缓存
# /usr/local/sbin/squid -z

六、启动服务
# vi /etc/rc.conf

squid_enable=”YES”

# /usr/local/etc/rc.d/squid start

五月 27th, 2012

Git管理多个项目

No Comments, Git, by garey, 10,708 views.

Git管理多个项目

Git是个很好的项目版本控制软件,现在用着感觉比SVN好太多了,个人觉得Git最大的好处在于可以很容易的创建与合并分支版本,这对于需要多个版本并行开发的项目组来说的确是个好帮手。

由于刚玩Git,发现Git在很多方面的确太老土了,比如客户端界面实在是不敢恭维,再说不同项目源的多个项目的管理,确实伤脑筋,查了很多资料,觉得还是有必要记录下来。
比如我现在有内外网两台Git服务器,分别是两个不同的项目,那就只需要修改ssh的配置文件即可:

vi ~/.ssh/config
# Default user(garey@bsdart.org)
Host bsdart.org
HostName bsdart.org
User garey
IdentityFile ~/.ssh/garey.bsdart.org

# second user(garey@bsdart.org)
Host 192.168.0.1
HostName 192.168.0.1
User garey
IdentityFile ~/.ssh/garey.local

这样就可以很容易在两个项目之间自由切换了。

五月 26th, 2011

五大主流浏览器CSS3和HTML5兼容性大比拼

No Comments, HTML5, by garey, 8,999 views.

本文是一份IE,Chrome,Firefox, Safari,Opera五大主流大浏览器,在 Mac 和 Windows 两个平台,对 CSS3 和 HTML5 各种特性支持情况的详细清单。

各大主流浏览器对 CSS3 和 HTML5 的支持越来越完善,曾经让多少前端开发人员心碎的IE系也开始拥抱标准。就在前几天,W3C的 HTML5 社区领袖 Shelley 宣布,HTML5的开发工作已经接近完成,如果进展顺利,HTML5 将在 2012 年正式成为国际标准。

当然,即使标准正式制定了,现代浏览器要普及到大部分用户也是需要一个相当漫长的过程。如果你现在就希望使用 CSS3 和 HTML5 创建你的站点,需要对各个浏览器对这两种新技术的支持情况有一个全面了解。本文是一份IE,Chrome,Firefox, Safari,Opera五大主流大浏览器,在 Mac 和 Windows 两个平台,对 CSS3 和 HTML5 各种特性支持情况的详细清单。

CSS3 属性

从表中可以看出,CSS Transforms 3D 还没有浏览器支持,除此之外的其它属性在 Windows 平台,Chrome 和 Safari 全部支持,其次支持比较好的是 Opera 和 Firefox,曾经一片红叉的 IE 开始迎头赶上。在 Mac 平台还是 Safari 仍然表现优异,其次是 Firefox 和 Opera。

 html501

CSS3 选择器

最让人高兴的就是这张表了,除了 IE 9 以下的版本,其它浏览器已全部支持 CSS3 选择器,包括 IE 9 和 将在明年发布的 IE 10。

 html502

HTML5 Web 应用程序

从表中可以看出,除了客户端数据库 IndexDB 和 触控(Touch)事件外,其它特性 Chrome 和 Safari 都全部支持,微软还得加油啊。(更新:经验证 Chrome 10 和 Firefox 4 已支持 IndexDB,Firefox 4 也已支持 WebSocket,不过由于安全原因默认是不开启的,我们可以通过 about:config 重新启用 WebSocket,只需启用 network.websocket.override-security-block 选项即可。)

html503

HTML5 图形和内嵌内容

这应该是 HTML5 最令人期待的东西了,内置画布,视频,音频,SVG,WebGL等对象。全部支持的有 Chrome,Firefox,还有 IE 9,很惊讶吧。

html504

HTML5 音频编码

Chrome 又是全部支持,Safari 除Ogg Vorbis 外全部支持,IE 9 开始支持 MP3 和 AAC。

html505

HTML5 视频编码

还是 Chrome 最厉害,包容天下,不知道 H.264 能否成为统一的视频编码标准,期待。

html506

HTML5 表单对象

这些浏览器中最淡定的要数 Opera 了,那么多年了市场份额都没什么大变化。在 Windows 和 Mac 平台,Opera 对 HTML5 表单对象全部支持,IE 家族全军覆没。

html507

HTML5 表单属性

IE 又一次全军覆没,Opera 依然全部支持,其次是 Safari,Chrome,Firefox。

html508

结论

目前,对 CSS3 和 HTML5 支持最好的是 Chrome,Safari 次之,Firefox 和 Opera 旗鼓相当,IE 9开始拥抱标准。鉴于这种情况,假如你想使用这两项新技术创建一个先锋体验式站点,现在的 CSS3 和 HTML5 可以让你实现,假如你想大规模应用于实际项目,现在还为时过早。

原文链接:http://www.oschina.net/news/18298

五月 6th, 2011

CentOS系统安装JDK

No Comments, Linux, by garey, 10,210 views.

CentOS系统安装JDK

一、下载jdk安装程序

到java官网下载(http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-download-346242.html)

二、安装

# mkdir /usr/local/jdk
# mv jdk-6u25-linux-x64.bin /usr/local/jdk/.
# chmod a+x jdk-6u25-linux-x64.bin
# ./jdk-6u25-linux-x64.bin

解压完成后在当前目录下会新建一个名为“jdk1.6.0_25”的目录,至此我们已经在CentOS下安装好了JDK。

三、设置环境变量

# vi /etc/profile
在最后加入以下几行:

export JAVA_HOME=/usr/local/jdk/jdk1.6.0_25
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin

三月 25th, 2011

PHP代码源被黑了!

No Comments, PHP, by garey, 7,841 views.

源头在于wiki.php.net的漏洞导致wiki账号被盗,而wiki的账号和php代码源的SVN提交权限相关联。

有图有真相:

224044_isHY_57579

原文:

The wiki.php.net box was compromised and the attackers were able to collect wiki account credentials. No other machines in the php.net infrastructure appear to have been affected. Our biggest concern is, of course, the integrity of our source code. We did an extensive code audit and looked at every commit since 5.3.5 to make sure that no stolen accounts were used to inject anything malicious. Nothing was found. The compromised machine has been wiped and we are forcing a password change for all svn accounts.

We are still investigating the details of the attack which combined a vulnerability in the Wiki software with a Linux root exploit.

内容大致是:

由于wiki账号被盗,PHP的代码源极有可能被污染,当然,PHP团队已经做最大的努力以保证自PHP5.3.5版本的代码没有收到污染,并且强迫SVN修改现有的密码。

而事件目前的状态是,他们仍然没法锁定漏洞所在,因为他们仍在排查。

一个很明显的问题是,PHP5.3.6以及其后续版本的代码已经被污染,目前只能把未受污染的代码版本确保到PHP5.3.5,下载PHP代码的人,要小心了。

而windows.php.net和wiki.php.net也已经暂停访问。

转自:http://www.oschina.net/news/16612/php-cracked

三月 17th, 2011

关于Memcache::increment和Memcache::decrement的使用

1 Comment, PHP, by garey, 34,293 views.

PHP在操作Memcache数据的时候,我们习惯用get,set,delete比较多些,突然发现increment和decrement其实是很有用的,听说使用得当对程序的性能是很有帮助的。

先看下文档里的说明:
Memcache::increment()将指定元素的值增加value。如果指定的key 对应的元素不是数值类型并且不能被转换为数值, 会将此值修改为value。
Memcache::decrement()方法将元素的值减小value。 类似于 Memcache::increment()方法,首先将元素当前值转换成数值然后减去value。

其实它的作用就是快速给Memcache里存储的数据增加或减少一定值,但前提是Memcache里面存储的数据是数值型的,这就要求在设计缓存数据库的时候把经常使用到的数值型的独立出来。

实例:
以前我们这样操作给key为’a'的值加1

<?php
$memcache_obj = new Memcache;
$memcache_obj->connect(‘localhost’, 11211) or die (“Could not connect”);
if ($s = $memcache_obj->get(‘a’)) {
    $s = $s+1;
    $memcache_obj->set(‘a’,$s);
}
else
$memcache_obj->set(‘a’,1);
echo $s;
?>

现在我们可以用increment方法操作

<?php
$memcache_obj = new Memcache;
$memcache_obj->connect(‘localhost’, 11211) or die (“Could not connect”);

if ($s = $memcache_obj->increment(‘a’,1)) {
   echo $s;   
}
else
$memcache_obj->set(‘a’,1);
?>

十二月 23rd, 2010

发现一款HTML5小游戏

No Comments, HTML5, by garey, 9,155 views.

刚在开源中国下载一款HTML5开发的小游戏,是一款塔防游戏,喜欢HTML5的童鞋一起来学习学习。

本来想直接加载在我的文章页面的,结果有问题,只能贴上图片和链接地址了。

HTML5 开发的塔防游戏 HTML5 开发的塔防游戏 HTML5 开发的塔防游戏 HTML5 开发的塔防游戏 HTML5 开发的塔防游戏 HTML5 开发的塔防游戏 HTML5 开发的塔防游戏

测试页面:http://garey.bsdart.org/test/html5-td/td.html

源码下载:http://garey.bsdart.org/test/html5-td/html5-td.zip

记得半年多前写过MySQL vs NoSQL ,且一直以来我比较坚持用数据库存储K/V数据,因为不只是对数据安全等能提供保障,主要是发现大部分系统的qps根本就没那么高,能上4k的水平已经很少了,这点MySQL完全可以满足,因为优化好的K/V请求,在MySQL的SQL层上能实现每核心5k左右的qps,而这一数据在HandlerSocket出来之后,得到了更大的提升。

HandlerSocket plugin for MySQL 已经出来一段时间了, 鉴于HandlerSocket和InnoDB的健壮、安全性, 可以预见HandlerSocket取代Memcached等NoSQL存储/Cache,已经是大势所趋。

HandlerSocket 是MySQL的一个插件,用于跳过MySQL的SQL层面,直接访问内部的InnoDB存储引擎,从而充分发挥InnoDB的性能优势;此外,InnoDB的ACID特性,可以保障数据的安全。mysql_handlersocket

初步对比了下,HandlerSocket Plugin for MySQL性能跟Memcached差不多,原文中的测试数据显示更胜Memcached一筹,接下来准备跟ndbapi的性能进行对比测试,为系统构架提供参考。handlersocket

HandlerSocket源码地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/

HandlerSocket的客户端:

HandlerSocket Client for Perl

HandlerSocket Client for Python

HandlerSocket Client for PHP

HandlerSocket Client for Java

原文:http://ourmysql.com/archives/897

十二月 2nd, 2010

[转]Chrome市场份额首次超过Firefox

No Comments, 互联网, by garey, 7,354 views.

新闻来源:weiphone
据科技媒体TechCrunch报道,根据他们的最新数据,Chrome浏览器的市场份额已经达到27.80%,超过Firefox的27.67%,Safari排在第三,为20.42%,IE为15.74%。据悉,在9月份的时候,刚发布两年的Chrome的市场份额就已经大幅增长,只和Firefox相差3%,现在终于超过。 Chrome市场份额首次超过Firefox

不过,Mozilla将在明年发布正式版Firefox 4,据说速度和功能都有很大提升,而微软也准备发布IE9,争取夺回失去的市场,主打社交功能的Flock和 RockMelt发展也都不错。另外,最关键的不是Chrome市场份额超过Firefox,而是Safari的市场份额已经非常高。目前每台 iPhone, iPad和iPod touch都装有Safari,这些产品庞大的销量让Safari的市场份额提升了10个百分点。因此,TechCrunch认为,Chrome最大的挑 战将来自Safari。 面对众多强劲对手,Chrome能将这种增长继续保持下去吗?

更多关于Chrome的详细信息,或者下载地址请点这里[URL:http://www.oschina.net/action/project/go?id=396&p=download]

原文:http://www.oschina.net/news/13480/chrome-exceed-firefox